diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index a32732ab6e6e..72bf2052627b 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,7 +34,7 @@ jobs: - name: Setup dotnet uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.100 + dotnet-version: 9.0.300 - name: Checkout repository uses: actions/checkout@v5 diff --git a/.github/workflows/csharp-qltest.yml b/.github/workflows/csharp-qltest.yml index 580861af17bb..3c73eaec3b61 100644 --- a/.github/workflows/csharp-qltest.yml +++ b/.github/workflows/csharp-qltest.yml @@ -43,14 +43,14 @@ jobs: - name: Setup dotnet uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.100 + dotnet-version: 9.0.300 - name: Extractor unit tests run: | dotnet tool restore - dotnet test -p:RuntimeFrameworkVersion=9.0.0 extractor/Semmle.Util.Tests - dotnet test -p:RuntimeFrameworkVersion=9.0.0 extractor/Semmle.Extraction.Tests - dotnet test -p:RuntimeFrameworkVersion=9.0.0 autobuilder/Semmle.Autobuild.CSharp.Tests - dotnet test -p:RuntimeFrameworkVersion=9.0.0 autobuilder/Semmle.Autobuild.Cpp.Tests + dotnet test -p:RuntimeFrameworkVersion=9.0.5 extractor/Semmle.Util.Tests + dotnet test -p:RuntimeFrameworkVersion=9.0.5 extractor/Semmle.Extraction.Tests + dotnet test -p:RuntimeFrameworkVersion=9.0.5 autobuilder/Semmle.Autobuild.CSharp.Tests + dotnet test -p:RuntimeFrameworkVersion=9.0.5 autobuilder/Semmle.Autobuild.Cpp.Tests shell: bash stubgentest: runs-on: ubuntu-latest diff --git a/.github/workflows/query-list.yml b/.github/workflows/query-list.yml index a383e381d90f..8c736379f8a6 100644 --- a/.github/workflows/query-list.yml +++ b/.github/workflows/query-list.yml @@ -31,7 +31,7 @@ jobs: with: python-version: 3.8 - name: Download CodeQL CLI - # Look under the `codeql` directory, as this is where we checked out the `github/codeql` repo + # Look under the `codeql` directory, as this is where we checked out the `github/codeql` repo uses: ./codeql/.github/actions/fetch-codeql - name: Build code scanning query list run: | diff --git a/MODULE.bazel b/MODULE.bazel index 2f7a18b35fa1..c2dc258aaac1 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -26,7 +26,7 @@ bazel_dep(name = "nlohmann_json", version = "3.11.3", repo_name = "json") bazel_dep(name = "fmt", version = "10.0.0") bazel_dep(name = "rules_kotlin", version = "2.1.3-codeql.1") bazel_dep(name = "gazelle", version = "0.40.0") -bazel_dep(name = "rules_dotnet", version = "0.17.4") +bazel_dep(name = "rules_dotnet", version = "0.19.2-codeql.1") bazel_dep(name = "googletest", version = "1.14.0.bcr.1") bazel_dep(name = "rules_rust", version = "0.63.0") bazel_dep(name = "zstd", version = "1.5.5.bcr.1") @@ -172,7 +172,7 @@ http_archive( ) dotnet = use_extension("@rules_dotnet//dotnet:extensions.bzl", "dotnet") -dotnet.toolchain(dotnet_version = "9.0.100") +dotnet.toolchain(dotnet_version = "9.0.300") use_repo(dotnet, "dotnet_toolchains") register_toolchains("@dotnet_toolchains//:all") diff --git a/actions/extractor/codeql-extractor.yml b/actions/extractor/codeql-extractor.yml index a1b08602f32b..376abe32597b 100644 --- a/actions/extractor/codeql-extractor.yml +++ b/actions/extractor/codeql-extractor.yml @@ -1,5 +1,4 @@ name: "actions" -aliases: [] display_name: "GitHub Actions" version: 0.0.1 column_kind: "utf16" @@ -8,9 +7,11 @@ build_modes: - none default_queries: - codeql/actions-queries -file_coverage_languages: [] +# Actions workflows are not reported separately by the GitHub API, so we can't +# associate them with a specific language. github_api_languages: [] -scc_languages: [] +scc_languages: + - YAML file_types: - name: workflow display_name: GitHub Actions workflow files diff --git a/actions/extractor/tools/baseline-config.json b/actions/extractor/tools/baseline-config.json new file mode 100644 index 000000000000..fde0bd1ecdff --- /dev/null +++ b/actions/extractor/tools/baseline-config.json @@ -0,0 +1,10 @@ +{ + "paths": [ + ".github/workflows/*.yml", + ".github/workflows/*.yaml", + ".github/reusable_workflows/**/*.yml", + ".github/reusable_workflows/**/*.yaml", + "**/action.yml", + "**/action.yaml" + ] +} diff --git a/actions/extractor/tools/configure-baseline.cmd b/actions/extractor/tools/configure-baseline.cmd new file mode 100755 index 000000000000..b9c1b3f7a028 --- /dev/null +++ b/actions/extractor/tools/configure-baseline.cmd @@ -0,0 +1,2 @@ +@echo off +type "%CODEQL_EXTRACTOR_ACTIONS_ROOT%\tools\baseline-config.json" diff --git a/actions/extractor/tools/configure-baseline.sh b/actions/extractor/tools/configure-baseline.sh new file mode 100755 index 000000000000..6fd7605ef3f9 --- /dev/null +++ b/actions/extractor/tools/configure-baseline.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +cat "$CODEQL_EXTRACTOR_ACTIONS_ROOT/tools/baseline-config.json" diff --git a/actions/ql/integration-tests/query-suite/actions-code-scanning.qls.expected b/actions/ql/integration-tests/query-suite/actions-code-scanning.qls.expected index 4a12174ffbda..90ee8a79483c 100644 --- a/actions/ql/integration-tests/query-suite/actions-code-scanning.qls.expected +++ b/actions/ql/integration-tests/query-suite/actions-code-scanning.qls.expected @@ -1,3 +1,4 @@ +ql/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql ql/actions/ql/src/Security/CWE-077/EnvPathInjectionCritical.ql ql/actions/ql/src/Security/CWE-077/EnvVarInjectionCritical.ql ql/actions/ql/src/Security/CWE-094/CodeInjectionCritical.ql diff --git a/actions/ql/integration-tests/query-suite/actions-security-and-quality.qls.expected b/actions/ql/integration-tests/query-suite/actions-security-and-quality.qls.expected index d071a33c1861..111fc3e45243 100644 --- a/actions/ql/integration-tests/query-suite/actions-security-and-quality.qls.expected +++ b/actions/ql/integration-tests/query-suite/actions-security-and-quality.qls.expected @@ -1,4 +1,5 @@ ql/actions/ql/src/Debug/SyntaxError.ql +ql/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql ql/actions/ql/src/Security/CWE-077/EnvPathInjectionCritical.ql ql/actions/ql/src/Security/CWE-077/EnvPathInjectionMedium.ql ql/actions/ql/src/Security/CWE-077/EnvVarInjectionCritical.ql diff --git a/actions/ql/integration-tests/query-suite/actions-security-extended.qls.expected b/actions/ql/integration-tests/query-suite/actions-security-extended.qls.expected index 06a9c6745e48..6ee3140d0706 100644 --- a/actions/ql/integration-tests/query-suite/actions-security-extended.qls.expected +++ b/actions/ql/integration-tests/query-suite/actions-security-extended.qls.expected @@ -1,3 +1,4 @@ +ql/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql ql/actions/ql/src/Security/CWE-077/EnvPathInjectionCritical.ql ql/actions/ql/src/Security/CWE-077/EnvPathInjectionMedium.ql ql/actions/ql/src/Security/CWE-077/EnvVarInjectionCritical.ql diff --git a/actions/ql/lib/CHANGELOG.md b/actions/ql/lib/CHANGELOG.md index 5009104e9af3..60f6a45ea945 100644 --- a/actions/ql/lib/CHANGELOG.md +++ b/actions/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.4.17 + +No user-facing changes. + ## 0.4.16 No user-facing changes. diff --git a/actions/ql/lib/change-notes/released/0.4.17.md b/actions/ql/lib/change-notes/released/0.4.17.md new file mode 100644 index 000000000000..30a27b84b732 --- /dev/null +++ b/actions/ql/lib/change-notes/released/0.4.17.md @@ -0,0 +1,3 @@ +## 0.4.17 + +No user-facing changes. diff --git a/actions/ql/lib/codeql-pack.release.yml b/actions/ql/lib/codeql-pack.release.yml index 0664e01a1ddb..d5b31a0cac9f 100644 --- a/actions/ql/lib/codeql-pack.release.yml +++ b/actions/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.4.16 +lastReleaseVersion: 0.4.17 diff --git a/actions/ql/lib/codeql/Locations.qll b/actions/ql/lib/codeql/Locations.qll index 96b5d45f18e0..24c6ae9cda1d 100644 --- a/actions/ql/lib/codeql/Locations.qll +++ b/actions/ql/lib/codeql/Locations.qll @@ -70,8 +70,8 @@ class Location extends TLocation, TBaseLocation { /** * Holds if this element is at the specified location. - * The location spans column `startcolumn` of line `startline` to - * column `endcolumn` of line `endline` in file `filepath`. + * The location spans column `sc` of line `sl` to + * column `ec` of line `el` in file `p`. * For more information, see * [Providing locations in CodeQL queries](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ diff --git a/actions/ql/lib/codeql/actions/Ast.qll b/actions/ql/lib/codeql/actions/Ast.qll index ae19a7a7e8ca..6e76e4cd665a 100644 --- a/actions/ql/lib/codeql/actions/Ast.qll +++ b/actions/ql/lib/codeql/actions/Ast.qll @@ -261,7 +261,7 @@ class If extends AstNode instanceof IfImpl { } /** - * An Environemnt node representing a deployment environment. + * An Environment node representing a deployment environment. */ class Environment extends AstNode instanceof EnvironmentImpl { string getName() { result = super.getName() } diff --git a/actions/ql/lib/codeql/actions/ast/internal/Ast.qll b/actions/ql/lib/codeql/actions/ast/internal/Ast.qll index b0cbb8a1d79e..b922214e21c5 100644 --- a/actions/ql/lib/codeql/actions/ast/internal/Ast.qll +++ b/actions/ql/lib/codeql/actions/ast/internal/Ast.qll @@ -125,12 +125,11 @@ abstract class AstNodeImpl extends TAstNode { * Gets the enclosing Step. */ StepImpl getEnclosingStep() { - if this instanceof StepImpl - then result = this - else - if this instanceof ScalarValueImpl - then result.getAChildNode*() = this.getParentNode() - else none() + this instanceof StepImpl and + result = this + or + this instanceof ScalarValueImpl and + result.getAChildNode*() = this.getParentNode() } /** @@ -1416,9 +1415,8 @@ class ExternalJobImpl extends JobImpl, UsesImpl { override string getVersion() { exists(YamlString name | n.lookup("uses") = name and - if not name.getValue().matches("\\.%") - then result = name.getValue().regexpCapture(repoUsesParser(), 4) - else none() + not name.getValue().matches("\\.%") and + result = name.getValue().regexpCapture(repoUsesParser(), 4) ) } } diff --git a/actions/ql/lib/codeql/actions/controlflow/BasicBlocks.qll b/actions/ql/lib/codeql/actions/controlflow/BasicBlocks.qll index af5e0f62552f..2dcfd81a47dc 100644 --- a/actions/ql/lib/codeql/actions/controlflow/BasicBlocks.qll +++ b/actions/ql/lib/codeql/actions/controlflow/BasicBlocks.qll @@ -286,7 +286,7 @@ private module Cached { /** * Holds if `cfn` is the `i`th node in basic block `bb`. * - * In other words, `i` is the shortest distance from a node `bb` + * In other words, `i` is the shortest distance from a node `bbStart` * that starts a basic block to `cfn` along the `intraBBSucc` relation. */ cached diff --git a/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll b/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll index 06295e3d88d4..38ce9e7e03db 100644 --- a/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll +++ b/actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll @@ -3,6 +3,8 @@ private import codeql.controlflow.Cfg as CfgShared private import codeql.Locations module Completion { + import codeql.controlflow.SuccessorType + private newtype TCompletion = TSimpleCompletion() or TBooleanCompletion(boolean b) { b in [false, true] } or @@ -25,7 +27,7 @@ module Completion { override predicate isValidFor(AstNode e) { not any(Completion c).isValidForSpecific(e) } - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } } class BooleanCompletion extends NormalCompletion, TBooleanCompletion { @@ -49,34 +51,6 @@ module Completion { override ReturnSuccessor getAMatchingSuccessorType() { any() } } - - cached - private newtype TSuccessorType = - TNormalSuccessor() or - TBooleanSuccessor(boolean b) { b in [false, true] } or - TReturnSuccessor() - - class SuccessorType extends TSuccessorType { - string toString() { none() } - } - - class NormalSuccessor extends SuccessorType, TNormalSuccessor { - override string toString() { result = "successor" } - } - - class BooleanSuccessor extends SuccessorType, TBooleanSuccessor { - boolean value; - - BooleanSuccessor() { this = TBooleanSuccessor(value) } - - override string toString() { result = value.toString() } - - boolean getValue() { result = value } - } - - class ReturnSuccessor extends SuccessorType, TReturnSuccessor { - override string toString() { result = "return" } - } } module CfgScope { @@ -127,14 +101,8 @@ private module Implementation implements CfgShared::InputSig { last(scope.(CompositeAction), e, c) } - predicate successorTypeIsSimple(SuccessorType t) { t instanceof NormalSuccessor } - - predicate successorTypeIsCondition(SuccessorType t) { t instanceof BooleanSuccessor } - SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate isAbnormalExitType(SuccessorType t) { none() } - int idOfAstNode(AstNode node) { none() } int idOfCfgScope(CfgScope scope) { none() } diff --git a/actions/ql/lib/codeql/actions/dataflow/ExternalFlow.qll b/actions/ql/lib/codeql/actions/dataflow/ExternalFlow.qll index 2914dac5f0a6..9667c6e525ea 100644 --- a/actions/ql/lib/codeql/actions/dataflow/ExternalFlow.qll +++ b/actions/ql/lib/codeql/actions/dataflow/ExternalFlow.qll @@ -63,10 +63,10 @@ predicate madSource(DataFlow::Node source, string kind, string fieldName) { ( if fieldName.trim().matches("env.%") then source.asExpr() = uses.getInScopeEnvVarExpr(fieldName.trim().replaceAll("env.", "")) - else - if fieldName.trim().matches("output.%") - then source.asExpr() = uses - else none() + else ( + fieldName.trim().matches("output.%") and + source.asExpr() = uses + ) ) ) } diff --git a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll index df3d513d0050..18cc4322c81b 100644 --- a/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll +++ b/actions/ql/lib/codeql/actions/dataflow/FlowSources.qll @@ -31,14 +31,14 @@ abstract class RemoteFlowSource extends SourceNode { class GitHubCtxSource extends RemoteFlowSource { string flag; string event; - GitHubExpression e; GitHubCtxSource() { - this.asExpr() = e and - // github.head_ref - e.getFieldName() = "head_ref" and - flag = "branch" and - ( + exists(GitHubExpression e | + this.asExpr() = e and + // github.head_ref + e.getFieldName() = "head_ref" and + flag = "branch" + | event = e.getATriggerEvent().getName() and event = "pull_request_target" or @@ -148,7 +148,6 @@ class GhCLICommandSource extends RemoteFlowSource, CommandSource { class GitHubEventPathSource extends RemoteFlowSource, CommandSource { string cmd; string flag; - string access_path; Run run; // Examples @@ -163,7 +162,7 @@ class GitHubEventPathSource extends RemoteFlowSource, CommandSource { run.getScript().getACommand() = cmd and cmd.matches("jq%") and cmd.matches("%GITHUB_EVENT_PATH%") and - exists(string regexp | + exists(string regexp, string access_path | untrustedEventPropertiesDataModel(regexp, flag) and not flag = "json" and access_path = "github.event" + cmd.regexpCapture(".*\\s+([^\\s]+)\\s+.*", 1) and diff --git a/actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll b/actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll index 679b8977cf91..1795e9493cb4 100644 --- a/actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll +++ b/actions/ql/lib/codeql/actions/security/ArgumentInjectionQuery.qll @@ -19,7 +19,6 @@ abstract class ArgumentInjectionSink extends DataFlow::Node { */ class ArgumentInjectionFromEnvVarSink extends ArgumentInjectionSink { string command; - string argument; ArgumentInjectionFromEnvVarSink() { exists(Run run, string var | @@ -28,7 +27,7 @@ class ArgumentInjectionFromEnvVarSink extends ArgumentInjectionSink { exists(run.getInScopeEnvVarExpr(var)) or var = "GITHUB_HEAD_REF" ) and - run.getScript().getAnEnvReachingArgumentInjectionSink(var, command, argument) + run.getScript().getAnEnvReachingArgumentInjectionSink(var, command, _) ) } @@ -44,13 +43,12 @@ class ArgumentInjectionFromEnvVarSink extends ArgumentInjectionSink { */ class ArgumentInjectionFromCommandSink extends ArgumentInjectionSink { string command; - string argument; ArgumentInjectionFromCommandSink() { exists(CommandSource source, Run run | run = source.getEnclosingRun() and this.asExpr() = run.getScript() and - run.getScript().getACmdReachingArgumentInjectionSink(source.getCommand(), command, argument) + run.getScript().getACmdReachingArgumentInjectionSink(source.getCommand(), command, _) ) } diff --git a/actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll b/actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll index 76025a9ba0db..9f3ed33db961 100644 --- a/actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll +++ b/actions/ql/lib/codeql/actions/security/ArtifactPoisoningQuery.qll @@ -125,8 +125,6 @@ class LegitLabsDownloadArtifactActionStep extends UntrustedArtifactDownloadStep, } class ActionsGitHubScriptDownloadStep extends UntrustedArtifactDownloadStep, UsesStep { - string script; - ActionsGitHubScriptDownloadStep() { // eg: // - uses: actions/github-script@v6 @@ -149,12 +147,14 @@ class ActionsGitHubScriptDownloadStep extends UntrustedArtifactDownloadStep, Use // var fs = require('fs'); // fs.writeFileSync('${{github.workspace}}/test-results.zip', Buffer.from(download.data)); this.getCallee() = "actions/github-script" and - this.getArgument("script") = script and - script.matches("%listWorkflowRunArtifacts(%") and - script.matches("%downloadArtifact(%") and - script.matches("%writeFileSync(%") and - // Filter out artifacts that were created by pull-request. - not script.matches("%exclude_pull_requests: true%") + exists(string script | + this.getArgument("script") = script and + script.matches("%listWorkflowRunArtifacts(%") and + script.matches("%downloadArtifact(%") and + script.matches("%writeFileSync(%") and + // Filter out artifacts that were created by pull-request. + not script.matches("%exclude_pull_requests: true%") + ) } override string getPath() { @@ -171,10 +171,10 @@ class ActionsGitHubScriptDownloadStep extends UntrustedArtifactDownloadStep, Use .getScript() .getACommand() .regexpCapture(unzipRegexp() + unzipDirArgRegexp(), 3))) - else - if this.getAFollowingStep().(Run).getScript().getACommand().regexpMatch(unzipRegexp()) - then result = "GITHUB_WORKSPACE/" - else none() + else ( + this.getAFollowingStep().(Run).getScript().getACommand().regexpMatch(unzipRegexp()) and + result = "GITHUB_WORKSPACE/" + ) } } @@ -207,12 +207,13 @@ class GHRunArtifactDownloadStep extends UntrustedArtifactDownloadStep, Run { .getScript() .getACommand() .regexpCapture(unzipRegexp() + unzipDirArgRegexp(), 3))) - else - if + else ( + ( this.getAFollowingStep().(Run).getScript().getACommand().regexpMatch(unzipRegexp()) or this.getScript().getACommand().regexpMatch(unzipRegexp()) - then result = "GITHUB_WORKSPACE/" - else none() + ) and + result = "GITHUB_WORKSPACE/" + ) } } @@ -259,15 +260,15 @@ class DirectArtifactDownloadStep extends UntrustedArtifactDownloadStep, Run { class ArtifactPoisoningSink extends DataFlow::Node { UntrustedArtifactDownloadStep download; - PoisonableStep poisonable; ArtifactPoisoningSink() { - download.getAFollowingStep() = poisonable and - // excluding artifacts downloaded to the temporary directory - not download.getPath().regexpMatch("^/tmp.*") and - not download.getPath().regexpMatch("^\\$\\{\\{\\s*runner\\.temp\\s*}}.*") and - not download.getPath().regexpMatch("^\\$RUNNER_TEMP.*") and - ( + exists(PoisonableStep poisonable | + download.getAFollowingStep() = poisonable and + // excluding artifacts downloaded to the temporary directory + not download.getPath().regexpMatch("^/tmp.*") and + not download.getPath().regexpMatch("^\\$\\{\\{\\s*runner\\.temp\\s*}}.*") and + not download.getPath().regexpMatch("^\\$RUNNER_TEMP.*") + | poisonable.(Run).getScript() = this.asExpr() and ( // Check if the poisonable step is a local script execution step diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 244c04310d6d..41f512abbc34 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -159,11 +159,8 @@ abstract class CommentVsHeadDateCheck extends ControlCheck { /* Specific implementations of control checks */ class LabelIfCheck extends LabelCheck instanceof If { - string condition; - LabelIfCheck() { - condition = normalizeExpr(this.getCondition()) and - ( + exists(string condition | condition = normalizeExpr(this.getCondition()) | // eg: contains(github.event.pull_request.labels.*.name, 'safe to test') condition.regexpMatch(".*(^|[^!])contains\\(\\s*github\\.event\\.pull_request\\.labels\\b.*") or diff --git a/actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll b/actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll index 2022e3dca998..ea8a800ef3f6 100644 --- a/actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll +++ b/actions/ql/lib/codeql/actions/security/EnvVarInjectionQuery.qll @@ -55,12 +55,8 @@ class EnvVarInjectionFromFileReadSink extends EnvVarInjectionSink { * echo "COMMIT_MESSAGE=${COMMIT_MESSAGE}" >> $GITHUB_ENV */ class EnvVarInjectionFromCommandSink extends EnvVarInjectionSink { - CommandSource inCommand; - string injectedVar; - string command; - EnvVarInjectionFromCommandSink() { - exists(Run run | + exists(Run run, CommandSource inCommand, string injectedVar, string command | this.asExpr() = inCommand.getEnclosingRun().getScript() and run = inCommand.getEnclosingRun() and run.getScript().getACmdReachingGitHubEnvWrite(inCommand.getCommand(), injectedVar) and @@ -86,12 +82,8 @@ class EnvVarInjectionFromCommandSink extends EnvVarInjectionSink { * echo "FOO=$BODY" >> $GITHUB_ENV */ class EnvVarInjectionFromEnvVarSink extends EnvVarInjectionSink { - string inVar; - string injectedVar; - string command; - EnvVarInjectionFromEnvVarSink() { - exists(Run run | + exists(Run run, string inVar, string injectedVar, string command | run.getScript() = this.asExpr() and exists(run.getInScopeEnvVarExpr(inVar)) and run.getScript().getAnEnvReachingGitHubEnvWrite(inVar, injectedVar) and diff --git a/actions/ql/lib/codeql/actions/security/OutputClobberingQuery.qll b/actions/ql/lib/codeql/actions/security/OutputClobberingQuery.qll index c67d2876b091..4454a5496a2f 100644 --- a/actions/ql/lib/codeql/actions/security/OutputClobberingQuery.qll +++ b/actions/ql/lib/codeql/actions/security/OutputClobberingQuery.qll @@ -99,18 +99,14 @@ class OutputClobberingFromEnvVarSink extends OutputClobberingSink { * echo $BODY */ class WorkflowCommandClobberingFromEnvVarSink extends OutputClobberingSink { - string clobbering_var; - string clobbered_value; - WorkflowCommandClobberingFromEnvVarSink() { - exists(Run run, string workflow_cmd_stmt, string clobbering_stmt | + exists(Run run, string workflow_cmd_stmt, string clobbering_stmt, string clobbering_var | run.getScript() = this.asExpr() and run.getScript().getAStmt() = clobbering_stmt and clobbering_stmt.regexpMatch("echo\\s+(-e\\s+)?(\"|')?\\$(\\{)?" + clobbering_var + ".*") and exists(run.getInScopeEnvVarExpr(clobbering_var)) and run.getScript().getAStmt() = workflow_cmd_stmt and - clobbered_value = - trimQuotes(workflow_cmd_stmt.regexpCapture(".*::set-output\\s+name=.*::(.*)", 1)) + exists(trimQuotes(workflow_cmd_stmt.regexpCapture(".*::set-output\\s+name=.*::(.*)", 1))) ) } } diff --git a/actions/ql/lib/codeql/actions/security/UseOfUnversionedImmutableAction.qll b/actions/ql/lib/codeql/actions/security/UseOfUnversionedImmutableAction.qll index ef258fce2e5c..8595cd1086d6 100644 --- a/actions/ql/lib/codeql/actions/security/UseOfUnversionedImmutableAction.qll +++ b/actions/ql/lib/codeql/actions/security/UseOfUnversionedImmutableAction.qll @@ -1,10 +1,8 @@ import actions class UnversionedImmutableAction extends UsesStep { - string immutable_action; - UnversionedImmutableAction() { - isImmutableAction(this, immutable_action) and + isImmutableAction(this, _) and not isSemVer(this.getVersion()) } } diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index 5bc126007a27..55e8a97e16bb 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.4.16 +version: 0.4.17 library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/CHANGELOG.md b/actions/ql/src/CHANGELOG.md index 265e67e6a89b..78b4591c5210 100644 --- a/actions/ql/src/CHANGELOG.md +++ b/actions/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.6.9 + +### Minor Analysis Improvements + +* Actions analysis now reports file coverage information on the CodeQL status page. + ## 0.6.8 No user-facing changes. diff --git a/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql b/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql new file mode 100644 index 000000000000..eebf889a3885 --- /dev/null +++ b/actions/ql/src/Diagnostics/SuccessfullyExtractedFiles.ql @@ -0,0 +1,13 @@ +/** + * @id actions/diagnostics/successfully-extracted-files + * @name Extracted files + * @description List all files that were extracted. + * @kind diagnostic + * @tags successfully-extracted-files + */ + +private import codeql.Locations + +from File f +where exists(f.getRelativePath()) +select f, "" diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md index de3307550ad2..6060354b134a 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutCritical.md @@ -32,7 +32,7 @@ jobs: - uses: actions/setup-node@v1 - run: | - npm install # scripts in package.json from PR would be executed here + npm install # scripts in package.json from PR would be executed here npm build - uses: completely/fakeaction@v2 diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md index de3307550ad2..6060354b134a 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutHigh.md @@ -32,7 +32,7 @@ jobs: - uses: actions/setup-node@v1 - run: | - npm install # scripts in package.json from PR would be executed here + npm install # scripts in package.json from PR would be executed here npm build - uses: completely/fakeaction@v2 diff --git a/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md b/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md index de3307550ad2..6060354b134a 100644 --- a/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md +++ b/actions/ql/src/Security/CWE-829/UntrustedCheckoutMedium.md @@ -32,7 +32,7 @@ jobs: - uses: actions/setup-node@v1 - run: | - npm install # scripts in package.json from PR would be executed here + npm install # scripts in package.json from PR would be executed here npm build - uses: completely/fakeaction@v2 diff --git a/actions/ql/src/change-notes/released/0.6.9.md b/actions/ql/src/change-notes/released/0.6.9.md new file mode 100644 index 000000000000..fd1d956946b7 --- /dev/null +++ b/actions/ql/src/change-notes/released/0.6.9.md @@ -0,0 +1,5 @@ +## 0.6.9 + +### Minor Analysis Improvements + +* Actions analysis now reports file coverage information on the CodeQL status page. diff --git a/actions/ql/src/codeql-pack.release.yml b/actions/ql/src/codeql-pack.release.yml index cad7cba6ce36..f03da398190a 100644 --- a/actions/ql/src/codeql-pack.release.yml +++ b/actions/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.6.8 +lastReleaseVersion: 0.6.9 diff --git a/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql b/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql index 519437ddb229..517a9d1eaad7 100644 --- a/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql +++ b/actions/ql/src/experimental/Security/CWE-829/ArtifactPoisoningPathTraversal.ql @@ -37,8 +37,6 @@ where ) or // upload artifact is not used in the same workflow - not exists(UsesStep upload | - download.getEnclosingWorkflow().getAJob().(LocalJob).getAStep() = upload - ) + not download.getEnclosingWorkflow().getAJob().(LocalJob).getAStep() instanceof UsesStep ) select download, "Potential artifact poisoning" diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 27bfe21bcc3c..ea42e41ebb88 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.8 +version: 0.6.9 library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/config/add-overlay-annotations.py b/config/add-overlay-annotations.py index 85b42026d8d7..0a30eee5799b 100644 --- a/config/add-overlay-annotations.py +++ b/config/add-overlay-annotations.py @@ -177,6 +177,12 @@ def insert_overlay_caller_annotations(lines): out_lines.append(line) return out_lines +explicitly_global = set([ + "java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll", + "java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll", + "java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll", + "java/ql/lib/semmle/code/java/dispatch/internal/Unification.qll", +]) def annotate_as_appropriate(filename, lines): ''' @@ -196,6 +202,9 @@ def annotate_as_appropriate(filename, lines): ((filename.endswith("Query.qll") or filename.endswith("Config.qll")) and any("implements DataFlow::ConfigSig" in line for line in lines))): return None + elif filename in explicitly_global: + # These files are explicitly global and should not be annotated. + return None elif not any(line for line in lines if line.strip()): return None diff --git a/cpp/ql/integration-tests/query-suite/cpp-code-scanning.qls.expected b/cpp/ql/integration-tests/query-suite/cpp-code-scanning.qls.expected index c307f26d3dbf..33c02079fff8 100644 --- a/cpp/ql/integration-tests/query-suite/cpp-code-scanning.qls.expected +++ b/cpp/ql/integration-tests/query-suite/cpp-code-scanning.qls.expected @@ -7,12 +7,10 @@ ql/cpp/ql/src/Diagnostics/ExtractedFiles.ql ql/cpp/ql/src/Diagnostics/ExtractionWarnings.ql ql/cpp/ql/src/Diagnostics/FailedExtractorInvocations.ql ql/cpp/ql/src/Likely Bugs/Arithmetic/BadAdditionOverflowCheck.ql -ql/cpp/ql/src/Likely Bugs/Arithmetic/IntMultToLong.ql ql/cpp/ql/src/Likely Bugs/Arithmetic/SignedOverflowCheck.ql ql/cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql ql/cpp/ql/src/Likely Bugs/Format/SnprintfOverflow.ql ql/cpp/ql/src/Likely Bugs/Format/WrongNumberOfFormatArguments.ql -ql/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.ql ql/cpp/ql/src/Likely Bugs/Memory Management/AllocaInLoop.ql ql/cpp/ql/src/Likely Bugs/Memory Management/PointerOverflow.ql ql/cpp/ql/src/Likely Bugs/Memory Management/ReturnStackAllocatedMemory.ql @@ -30,7 +28,6 @@ ql/cpp/ql/src/Security/CWE/CWE-120/VeryLikelyOverrunWrite.ql ql/cpp/ql/src/Security/CWE/CWE-131/NoSpaceForZeroTerminator.ql ql/cpp/ql/src/Security/CWE/CWE-134/UncontrolledFormatString.ql ql/cpp/ql/src/Security/CWE/CWE-190/ArithmeticUncontrolled.ql -ql/cpp/ql/src/Security/CWE/CWE-190/ComparisonWithWiderType.ql ql/cpp/ql/src/Security/CWE/CWE-191/UnsignedDifferenceExpressionComparedZero.ql ql/cpp/ql/src/Security/CWE/CWE-253/HResultBooleanConversion.ql ql/cpp/ql/src/Security/CWE/CWE-311/CleartextFileWrite.ql @@ -43,7 +40,6 @@ ql/cpp/ql/src/Security/CWE/CWE-367/TOCTOUFilesystemRace.ql ql/cpp/ql/src/Security/CWE/CWE-416/IteratorToExpiredContainer.ql ql/cpp/ql/src/Security/CWE/CWE-416/UseOfStringAfterLifetimeEnds.ql ql/cpp/ql/src/Security/CWE/CWE-416/UseOfUniquePointerAfterLifetimeEnds.ql -ql/cpp/ql/src/Security/CWE/CWE-468/SuspiciousAddWithSizeof.ql ql/cpp/ql/src/Security/CWE/CWE-497/ExposedSystemData.ql ql/cpp/ql/src/Security/CWE/CWE-611/XXE.ql ql/cpp/ql/src/Security/CWE/CWE-676/DangerousFunctionOverflow.ql diff --git a/cpp/ql/lib/CHANGELOG.md b/cpp/ql/lib/CHANGELOG.md index 705432b565de..cfe24937b744 100644 --- a/cpp/ql/lib/CHANGELOG.md +++ b/cpp/ql/lib/CHANGELOG.md @@ -1,3 +1,13 @@ +## 5.6.0 + +### Deprecated APIs + +* The predicate `getAContructorCall` in the class `SslContextClass` has been deprecated. Use `getAConstructorCall` instead. + +### New Features + +* Added predicates `getTransitiveNumberOfVlaDimensionStmts`, `getTransitiveVlaDimensionStmt`, and `getParentVlaDecl` to `VlaDeclStmt` for handling `VlaDeclStmt`s whose base type is defined in terms of another `VlaDeclStmt` via a `typedef`. + ## 5.5.0 ### New Features diff --git a/cpp/ql/lib/Options.qll b/cpp/ql/lib/Options.qll index a0a13881a941..c4652e3f6cae 100644 --- a/cpp/ql/lib/Options.qll +++ b/cpp/ql/lib/Options.qll @@ -35,7 +35,7 @@ class CustomOptions extends Options { override predicate returnsNull(Call call) { Options.super.returnsNull(call) } /** - * Holds if a call to this function will never return. + * Holds if a call to the function `f` will never return. * * By default, this holds for `exit`, `_exit`, `abort`, `__assert_fail`, * `longjmp`, `error`, `__builtin_unreachable` and any function with a diff --git a/cpp/ql/lib/change-notes/released/5.6.0.md b/cpp/ql/lib/change-notes/released/5.6.0.md new file mode 100644 index 000000000000..a21fadb3bf33 --- /dev/null +++ b/cpp/ql/lib/change-notes/released/5.6.0.md @@ -0,0 +1,9 @@ +## 5.6.0 + +### Deprecated APIs + +* The predicate `getAContructorCall` in the class `SslContextClass` has been deprecated. Use `getAConstructorCall` instead. + +### New Features + +* Added predicates `getTransitiveNumberOfVlaDimensionStmts`, `getTransitiveVlaDimensionStmt`, and `getParentVlaDecl` to `VlaDeclStmt` for handling `VlaDeclStmt`s whose base type is defined in terms of another `VlaDeclStmt` via a `typedef`. diff --git a/cpp/ql/lib/codeql-pack.release.yml b/cpp/ql/lib/codeql-pack.release.yml index 4b8cf9533c17..df73323b21f0 100644 --- a/cpp/ql/lib/codeql-pack.release.yml +++ b/cpp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.5.0 +lastReleaseVersion: 5.6.0 diff --git a/cpp/ql/lib/experimental/cryptography/CryptoArtifact.qll b/cpp/ql/lib/experimental/cryptography/CryptoArtifact.qll index 0bb22d688edf..296b97f66f21 100644 --- a/cpp/ql/lib/experimental/cryptography/CryptoArtifact.qll +++ b/cpp/ql/lib/experimental/cryptography/CryptoArtifact.qll @@ -127,7 +127,7 @@ abstract class CryptographicAlgorithm extends CryptographicArtifact { /** * Normalizes a raw name into a normalized name as found in `CryptoAlgorithmNames.qll`. * Subclassess should override for more api-specific normalization. - * By deafult, converts a raw name to upper-case with no hyphen, underscore, hash, or space. + * By default, converts a raw name to upper-case with no hyphen, underscore, hash, or space. */ bindingset[s] string normalizeName(string s) { diff --git a/cpp/ql/lib/experimental/cryptography/modules/OpenSSL.qll b/cpp/ql/lib/experimental/cryptography/modules/OpenSSL.qll index 0a52fa5bb815..6b6338a49260 100644 --- a/cpp/ql/lib/experimental/cryptography/modules/OpenSSL.qll +++ b/cpp/ql/lib/experimental/cryptography/modules/OpenSSL.qll @@ -652,14 +652,14 @@ module KeyGeneration { * Trace from EVP_PKEY_CTX* at algorithm sink to keygen, * users can then extrapolatae the matching algorithm from the alg sink to the keygen */ - module EVP_PKEY_CTX_Ptr_Source_to_KeyGenOperationWithNoSize implements DataFlow::ConfigSig { + module EVP_PKEY_CTX_Ptr_Source_to_KeyGenOperationWithNoSizeConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node source) { isEVP_PKEY_CTX_Source(source, _) } predicate isSink(DataFlow::Node sink) { isKeyGen_EVP_PKEY_CTX_Sink(sink, _) } } module EVP_PKEY_CTX_Ptr_Source_to_KeyGenOperationWithNoSize_Flow = - DataFlow::Global; + DataFlow::Global; /** * UNKNOWN key sizes to general purpose key generation functions (i.e., that take in no key size and assume diff --git a/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/CryptoFunction.qll b/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/CryptoFunction.qll index a265241a36bd..fd4b9000d2af 100644 --- a/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/CryptoFunction.qll +++ b/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/CryptoFunction.qll @@ -59,7 +59,7 @@ private string privateNormalizeFunctionName(Function f, string algType) { * * The predicate attempts to restrict normalization to what looks like an openssl * library by looking for functions only in an openssl path (see `isPossibleOpenSSLFunction`). - * This may give false postive functions if a directory erronously appears to be openssl; + * This may give false positive functions if a directory erronously appears to be openssl; * however, we take the stance that if a function * exists strongly mapping to a known function name in a directory such as these, * regardless of whether its actually a part of openSSL or not, we will analyze it as though it were. diff --git a/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/DataBuilders.qll b/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/DataBuilders.qll index ba83de345970..54121c367665 100644 --- a/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/DataBuilders.qll +++ b/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/DataBuilders.qll @@ -49,7 +49,7 @@ private string privateNormalizeFunctionName(Function f, string algType) { * * The predicate attempts to restrict normalization to what looks like an openssl * library by looking for functions only in an openssl path (see `isPossibleOpenSSLFunction`). - * This may give false postive functions if a directory erronously appears to be openssl; + * This may give false positive functions if a directory erronously appears to be openssl; * however, we take the stance that if a function * exists strongly mapping to a known function name in a directory such as these, * regardless of whether its actually a part of openSSL or not, we will analyze it as though it were. diff --git a/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/PassthroughFunction.qll b/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/PassthroughFunction.qll index f772f85afb10..e1e64f78e3ec 100644 --- a/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/PassthroughFunction.qll +++ b/cpp/ql/lib/experimental/cryptography/utils/OpenSSL/PassthroughFunction.qll @@ -31,7 +31,7 @@ predicate knownPassthroughFunction(Function f, int inInd, int outInd) { /** * `c` is a call to a function that preserves the algorithm but changes its form. - * `onExpr` is the input argument passing through to, `outExpr` is the next expression in a dataflow step associated with `c` + * `inExpr` is the input argument passing through to, `outExpr` is the next expression in a dataflow step associated with `c` */ predicate knownPassthoughCall(Call c, Expr inExpr, Expr outExpr) { exists(int inInd, int outInd | diff --git a/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/RangeAnalysis.qll b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/RangeAnalysis.qll index e5de44b396d8..e026c4dbe4b9 100644 --- a/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/RangeAnalysis.qll +++ b/cpp/ql/lib/experimental/semmle/code/cpp/rangeanalysis/RangeAnalysis.qll @@ -298,10 +298,11 @@ private predicate boundFlowStep(Instruction i, NonPhiOperand op, int delta, bool else if strictlyNegative(x) then upper = true and delta = -1 - else - if negative(x) - then upper = true and delta = 0 - else none() + else ( + negative(x) and + upper = true and + delta = 0 + ) ) or exists(Operand x | @@ -321,10 +322,11 @@ private predicate boundFlowStep(Instruction i, NonPhiOperand op, int delta, bool else if strictlyNegative(x) then upper = false and delta = 1 - else - if negative(x) - then upper = false and delta = 0 - else none() + else ( + negative(x) and + upper = false and + delta = 0 + ) ) or i.(RemInstruction).getRightOperand() = op and positive(op) and delta = -1 and upper = true diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index dacf9f622134..d87444db7bf5 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 5.5.0 +version: 5.6.0 groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/lib/semmle/code/cpp/Concept.qll b/cpp/ql/lib/semmle/code/cpp/Concept.qll index 1770c1965ed2..6e66bca98238 100644 --- a/cpp/ql/lib/semmle/code/cpp/Concept.qll +++ b/cpp/ql/lib/semmle/code/cpp/Concept.qll @@ -198,7 +198,7 @@ class ConceptIdExpr extends Expr, @concept_id { final Locatable getATemplateArgumentKind() { result = this.getTemplateArgumentKind(_) } /** - * Gets the `i`th template argument passed to the concept. + * Gets template argument at index `index` passed to the concept, if any. * * For example, if: * ```cpp @@ -219,7 +219,7 @@ class ConceptIdExpr extends Expr, @concept_id { } /** - * Gets the kind of the `i`th template argument value passed to the concept. + * Gets the kind of the template argument value at index `index` passed to the concept, if any. * * For example, if: * ```cpp diff --git a/cpp/ql/lib/semmle/code/cpp/Declaration.qll b/cpp/ql/lib/semmle/code/cpp/Declaration.qll index cedacca4dfe4..6f791234b638 100644 --- a/cpp/ql/lib/semmle/code/cpp/Declaration.qll +++ b/cpp/ql/lib/semmle/code/cpp/Declaration.qll @@ -223,8 +223,8 @@ class Declaration extends Locatable, @declaration { final Locatable getATemplateArgumentKind() { result = this.getTemplateArgumentKind(_) } /** - * Gets the `i`th template argument used to instantiate this declaration from a - * template. + * Gets the template argument at index `index` used to instantiate this declaration from a + * template, if any. * * For example: * @@ -245,9 +245,9 @@ class Declaration extends Locatable, @declaration { } /** - * Gets the `i`th template argument value used to instantiate this declaration - * from a template. When called on a template, this will return the `i`th template - * parameter value if it exists. + * Gets the template argument value at index `index` used to instantiate this declaration + * from a template. When called on a template, this will return the template + * parameter value at index `index` if it exists. * * For example: * diff --git a/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll b/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll index 51d2e294b36e..023ce09c5c18 100644 --- a/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll +++ b/cpp/ql/lib/semmle/code/cpp/commons/Printf.qll @@ -877,7 +877,7 @@ class FormatLiteral extends Literal instanceof StringLiteral { } /** - * Gets the char type required by the nth conversion specifier. + * Gets the char type required by the `n`th conversion specifier. * - in the base case this is the default for the formatting function * (e.g. `char` for `printf`, `char` or `wchar_t` for `wprintf`). * - the `%C` format character reverses wideness. @@ -922,7 +922,7 @@ class FormatLiteral extends Literal instanceof StringLiteral { } /** - * Gets the string type required by the nth conversion specifier. + * Gets the string type required by the `n`th conversion specifier. * - in the base case this is the default for the formatting function * (e.g. `char *` for `printf`, `char *` or `wchar_t *` for `wprintf`). * - the `%S` format character reverses wideness on some platforms. diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/Dominance.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/Dominance.qll index 424e615f3ea8..a8a4b867ba67 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/Dominance.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/Dominance.qll @@ -101,7 +101,7 @@ predicate postDominates(ControlFlowNode postDominator, ControlFlowNode node) { */ /** - * Holds if `dominator` is an immediate dominator of `node` in the control-flow + * Holds if `dom` is an immediate dominator of `node` in the control-flow * graph of basic blocks. */ predicate bbIDominates(BasicBlock dom, BasicBlock node) = @@ -117,7 +117,7 @@ private predicate bb_predecessor(BasicBlock succ, BasicBlock pred) { bb_successo private predicate bb_exit(ExitBasicBlock exit) { any() } /** - * Holds if `postDominator` is an immediate post-dominator of `node` in the control-flow + * Holds if `pDom` is an immediate post-dominator of `node` in the control-flow * graph of basic blocks. */ predicate bbIPostDominates(BasicBlock pDom, BasicBlock node) = diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll index 533df517af5d..f782a2c117d5 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/IRGuards.qll @@ -72,6 +72,20 @@ abstract private class GuardConditionImpl extends Expr { */ abstract predicate valueControls(BasicBlock controlled, AbstractValue v); + /** + * Holds if the control-flow edge `(pred, succ)` may be taken only if + * the value of this condition is `v`. + */ + abstract predicate valueControlsEdge(BasicBlock pred, BasicBlock succ, AbstractValue v); + + /** + * Holds if the control-flow edge `(pred, succ)` may be taken only if + * this the value of this condition is `testIsTrue`. + */ + final predicate controlsEdge(BasicBlock pred, BasicBlock succ, boolean testIsTrue) { + this.valueControlsEdge(pred, succ, any(BooleanValue bv | bv.getValue() = testIsTrue)) + } + /** * Holds if this condition controls `controlled`, meaning that `controlled` is only * entered if the value of this condition is `testIsTrue`. @@ -175,6 +189,58 @@ abstract private class GuardConditionImpl extends Expr { */ pragma[inline] abstract predicate ensuresEq(Expr e, int k, BasicBlock block, boolean areEqual); + + /** + * Holds if (determined by this guard) `left == right + k` must be `areEqual` on the edge from + * `pred` to `succ`. If `areEqual = false` then this implies `left != right + k`. + */ + pragma[inline] + final predicate ensuresEqEdge( + Expr left, Expr right, int k, BasicBlock pred, BasicBlock succ, boolean areEqual + ) { + exists(boolean testIsTrue | + this.comparesEq(left, right, k, areEqual, testIsTrue) and + this.controlsEdge(pred, succ, testIsTrue) + ) + } + + /** + * Holds if (determined by this guard) `e == k` must be `areEqual` on the edge from + * `pred` to `succ`. If `areEqual = false` then this implies `e != k`. + */ + pragma[inline] + final predicate ensuresEqEdge(Expr e, int k, BasicBlock pred, BasicBlock succ, boolean areEqual) { + exists(AbstractValue v | + this.comparesEq(e, k, areEqual, v) and + this.valueControlsEdge(pred, succ, v) + ) + } + + /** + * Holds if (determined by this guard) `left < right + k` must be `isLessThan` on the edge from + * `pred` to `succ`. If `isLessThan = false` then this implies `left >= right + k`. + */ + pragma[inline] + final predicate ensuresLtEdge( + Expr left, Expr right, int k, BasicBlock pred, BasicBlock succ, boolean isLessThan + ) { + exists(boolean testIsTrue | + this.comparesLt(left, right, k, isLessThan, testIsTrue) and + this.controlsEdge(pred, succ, testIsTrue) + ) + } + + /** + * Holds if (determined by this guard) `e < k` must be `isLessThan` on the edge from + * `pred` to `succ`. If `isLessThan = false` then this implies `e >= k`. + */ + pragma[inline] + final predicate ensuresLtEdge(Expr e, int k, BasicBlock pred, BasicBlock succ, boolean isLessThan) { + exists(AbstractValue v | + this.comparesLt(e, k, isLessThan, v) and + this.valueControlsEdge(pred, succ, v) + ) + } } final class GuardCondition = GuardConditionImpl; @@ -187,6 +253,16 @@ private class GuardConditionFromBinaryLogicalOperator extends GuardConditionImpl this.(BinaryLogicalOperation).getAnOperand() instanceof GuardCondition } + override predicate valueControlsEdge(BasicBlock pred, BasicBlock succ, AbstractValue v) { + exists(BinaryLogicalOperation binop, GuardCondition lhs, GuardCondition rhs | + this = binop and + lhs = binop.getLeftOperand() and + rhs = binop.getRightOperand() and + lhs.valueControlsEdge(pred, succ, v) and + rhs.valueControlsEdge(pred, succ, v) + ) + } + override predicate valueControls(BasicBlock controlled, AbstractValue v) { exists(BinaryLogicalOperation binop, GuardCondition lhs, GuardCondition rhs | this = binop and @@ -274,6 +350,25 @@ private predicate controlsBlock(IRGuardCondition ir, BasicBlock controlled, Abst ) } +/** + * Holds if `ir` controls the `(pred, succ)` edge, meaning that the edge + * `(pred, succ)` is only taken if the value of this condition is `v`. This + * helper predicate does not necessarily hold for binary logical operations + * like `&&` and `||`. + * See the detailed explanation on predicate `controlsEdge`. + */ +private predicate controlsEdge( + IRGuardCondition ir, BasicBlock pred, BasicBlock succ, AbstractValue v +) { + exists(IRBlock irPred, IRBlock irSucc | + ir.valueControlsEdge(irPred, irSucc, v) and + nonExcludedIRAndBasicBlock(irPred, pred) and + nonExcludedIRAndBasicBlock(irSucc, succ) and + not isUnreachedBlock(irPred) and + not isUnreachedBlock(irSucc) + ) +} + private class GuardConditionFromNotExpr extends GuardConditionImpl { IRGuardCondition ir; @@ -295,6 +390,10 @@ private class GuardConditionFromNotExpr extends GuardConditionImpl { controlsBlock(ir, controlled, v.getDualValue()) } + override predicate valueControlsEdge(BasicBlock pred, BasicBlock succ, AbstractValue v) { + controlsEdge(ir, pred, succ, v.getDualValue()) + } + pragma[inline] override predicate comparesLt(Expr left, Expr right, int k, boolean isLessThan, boolean testIsTrue) { exists(Instruction li, Instruction ri | @@ -383,6 +482,10 @@ private class GuardConditionFromIR extends GuardConditionImpl { controlsBlock(ir, controlled, v) } + override predicate valueControlsEdge(BasicBlock pred, BasicBlock succ, AbstractValue v) { + controlsEdge(ir, pred, succ, v) + } + pragma[inline] override predicate comparesLt(Expr left, Expr right, int k, boolean isLessThan, boolean testIsTrue) { exists(Instruction li, Instruction ri | diff --git a/cpp/ql/lib/semmle/code/cpp/controlflow/internal/CFG.qll b/cpp/ql/lib/semmle/code/cpp/controlflow/internal/CFG.qll index 05eafe28275f..23ef58592216 100644 --- a/cpp/ql/lib/semmle/code/cpp/controlflow/internal/CFG.qll +++ b/cpp/ql/lib/semmle/code/cpp/controlflow/internal/CFG.qll @@ -1042,8 +1042,8 @@ private predicate subEdgeIncludingDestructors(Pos p1, Node n1, Node n2, Pos p2) * - `MicrosoftTryFinallyStmt`: On the edge following the `__finally` block for * the case where an exception was thrown and needs to be propagated. */ -DestructorCall getSynthesisedDestructorCallAfterNode(Node n, int i) { - synthetic_destructor_call(n, i, result) +DestructorCall getSynthesisedDestructorCallAfterNode(Node node, int index) { + synthetic_destructor_call(node, index, result) } /** 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 72e742f13aa0..e6d53f8bf649 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowUtil.qll @@ -834,8 +834,10 @@ class ContentSet instanceof Content { * For more information, see * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ - predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { - super.hasLocationInfo(path, sl, sc, el, ec) + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) } } 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 ef4051171afb..82dcd43e1364 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 @@ -2273,8 +2273,10 @@ class ContentSet instanceof Content { * For more information, see * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ - predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { - super.hasLocationInfo(path, sl, sc, el, ec) + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.hasLocationInfo(filepath, startline, startcolumn, endline, endcolumn) } } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll index 0a0703fe16f4..c7ab5edf6249 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll @@ -2,6 +2,7 @@ * Provides classes that specify the conditions under which control flows along a given edge. */ +private import codeql.controlflow.SuccessorType private import internal.EdgeKindInternal private newtype TEdgeKind = @@ -28,6 +29,21 @@ abstract private class EdgeKindImpl extends TEdgeKind { final class EdgeKind = EdgeKindImpl; +private SuccessorType getAMatchingSpecificSuccessorType(EdgeKind k) { + result.(BooleanSuccessor).getValue() = true and k instanceof TrueEdge + or + result.(BooleanSuccessor).getValue() = false and k instanceof FalseEdge + or + result instanceof ExceptionSuccessor and k instanceof ExceptionEdge +} + +SuccessorType getAMatchingSuccessorType(EdgeKind k) { + result = getAMatchingSpecificSuccessorType(k) + or + not exists(getAMatchingSpecificSuccessorType(k)) and + result instanceof DirectSuccessor +} + /** * A "goto" edge, representing the unconditional successor of an `Instruction` * or `IRBlock`. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll index 89efaa8e15af..7f7c5cd0a4da 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll @@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) { } module IRCfg implements BB::CfgSig { - class ControlFlowNode = Instruction; + private import codeql.controlflow.SuccessorType - class SuccessorType = EdgeKind; + class ControlFlowNode = Instruction; final private class FinalIRBlock = IRBlock; @@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) } + BasicBlock getASuccessor(SuccessorType t) { + exists(EdgeKind k | + result = super.getSuccessor(k) and + t = getAMatchingSuccessorType(k) + ) + } predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll index 66d499112b81..f4b5a850a1f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/gvn/internal/ValueNumberingInternal.qll @@ -41,7 +41,7 @@ newtype TValueNumber = ) { loadTotalOverlapValueNumber(_, irFunc, type, memOperand, operand) } or - TUniqueValueNumber(IRFunction irFunc, Instruction instr) { uniqueValueNumber(instr, irFunc) } + TUniqueValueNumber(Instruction instr) { uniqueValueNumber(instr) } /** * A `ConvertInstruction` which converts data of type `T` to data of type `U` @@ -129,12 +129,14 @@ private predicate filteredNumberableInstruction(Instruction instr) { count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 ) + or + count(instr.getEnclosingIRFunction()) != 1 } private predicate variableAddressValueNumber( VariableAddressInstruction instr, IRFunction irFunc, Language::AST ast ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. @@ -144,7 +146,7 @@ private predicate variableAddressValueNumber( private predicate initializeParameterValueNumber( InitializeParameterInstruction instr, IRFunction irFunc, Language::AST var ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. @@ -154,7 +156,7 @@ private predicate initializeParameterValueNumber( private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -162,7 +164,7 @@ private predicate constantValueNumber( private predicate stringConstantValueNumber( StringConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getResultIRType() = type and instr.getValue().getValue() = value } @@ -171,7 +173,7 @@ private predicate fieldAddressValueNumber( FieldAddressInstruction instr, IRFunction irFunc, Language::Field field, TValueNumber objectAddress ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -182,7 +184,7 @@ private predicate binaryValueNumber0( TValueNumber valueNumber ) { not instr instanceof PointerArithmeticInstruction and - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and ( isLeft = true and @@ -206,7 +208,7 @@ private predicate pointerArithmeticValueNumber0( PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize, boolean isLeft, TValueNumber valueNumber ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and instr.getElementSize() = elementSize and ( @@ -229,7 +231,7 @@ private predicate pointerArithmeticValueNumber( private predicate unaryValueNumber( UnaryInstruction instr, IRFunction irFunc, Opcode opcode, TValueNumber operand ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and not instr instanceof InheritanceConversionInstruction and not instr instanceof CopyInstruction and not instr instanceof FieldAddressInstruction and @@ -242,7 +244,7 @@ private predicate inheritanceConversionValueNumber( InheritanceConversionInstruction instr, IRFunction irFunc, Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and tvalueNumber(instr.getUnary()) = operand and unique( | | instr.getBaseClass()) = baseClass and @@ -254,7 +256,7 @@ private predicate loadTotalOverlapValueNumber0( LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber valueNumber, boolean isAddress ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getResultIRType() = type and ( isAddress = true and @@ -277,8 +279,7 @@ private predicate loadTotalOverlapValueNumber( * Holds if `instr` should be assigned a unique value number because this library does not know how * to determine if two instances of that instruction are equivalent. */ -private predicate uniqueValueNumber(Instruction instr, IRFunction irFunc) { - instr.getEnclosingIRFunction() = irFunc and +private predicate uniqueValueNumber(Instruction instr) { not instr.getResultIRType() instanceof IRVoidType and ( not numberableInstruction(instr) @@ -294,10 +295,8 @@ cached TValueNumber tvalueNumber(Instruction instr) { result = nonUniqueValueNumber(instr) or - exists(IRFunction irFunc | - uniqueValueNumber(instr, irFunc) and - result = TUniqueValueNumber(irFunc, instr) - ) + uniqueValueNumber(instr) and + result = TUniqueValueNumber(instr) } /** @@ -311,68 +310,64 @@ TValueNumber tvalueNumberOfOperand(Operand op) { result = tvalueNumber(op.getDef * value number. */ private TValueNumber nonUniqueValueNumber(Instruction instr) { - exists(IRFunction irFunc | - irFunc = instr.getEnclosingIRFunction() and - ( - exists(Language::AST ast | - variableAddressValueNumber(instr, irFunc, ast) and - result = TVariableAddressValueNumber(irFunc, ast) - ) - or - exists(Language::AST var | - initializeParameterValueNumber(instr, irFunc, var) and - result = TInitializeParameterValueNumber(irFunc, var) - ) - or - exists(string value, IRType type | - constantValueNumber(instr, irFunc, type, value) and - result = TConstantValueNumber(irFunc, type, value) - ) - or - exists(IRType type, string value | - stringConstantValueNumber(instr, irFunc, type, value) and - result = TStringConstantValueNumber(irFunc, type, value) - ) - or - exists(Language::Field field, TValueNumber objectAddress | - fieldAddressValueNumber(instr, irFunc, field, objectAddress) and - result = TFieldAddressValueNumber(irFunc, field, objectAddress) - ) - or - exists(Opcode opcode, TValueNumber leftOperand, TValueNumber rightOperand | - binaryValueNumber(instr, irFunc, opcode, leftOperand, rightOperand) and - result = TBinaryValueNumber(irFunc, opcode, leftOperand, rightOperand) - ) - or - exists(Opcode opcode, TValueNumber operand | - unaryValueNumber(instr, irFunc, opcode, operand) and - result = TUnaryValueNumber(irFunc, opcode, operand) - ) - or - exists( - Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand - | - inheritanceConversionValueNumber(instr, irFunc, opcode, baseClass, derivedClass, operand) and - result = TInheritanceConversionValueNumber(irFunc, opcode, baseClass, derivedClass, operand) - ) - or - exists(Opcode opcode, int elementSize, TValueNumber leftOperand, TValueNumber rightOperand | - pointerArithmeticValueNumber(instr, irFunc, opcode, elementSize, leftOperand, rightOperand) and - result = - TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand) - ) - or - exists(IRType type, TValueNumber memOperand, TValueNumber operand | - loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and - result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand) - ) - or - // The value number of a copy is just the value number of its source value. - result = tvalueNumber(instr.(CongruentCopyInstruction).getSourceValue()) - or - // The value number of a type-preserving conversion is just the value - // number of the unconverted value. - result = tvalueNumber(instr.(TypePreservingConvertInstruction).getUnary()) + exists(IRFunction irFunc | irFunc = instr.getEnclosingIRFunction() | + exists(Language::AST ast | + variableAddressValueNumber(instr, irFunc, ast) and + result = TVariableAddressValueNumber(irFunc, ast) + ) + or + exists(Language::AST var | + initializeParameterValueNumber(instr, irFunc, var) and + result = TInitializeParameterValueNumber(irFunc, var) + ) + or + exists(string value, IRType type | + constantValueNumber(instr, irFunc, type, value) and + result = TConstantValueNumber(irFunc, type, value) + ) + or + exists(IRType type, string value | + stringConstantValueNumber(instr, irFunc, type, value) and + result = TStringConstantValueNumber(irFunc, type, value) + ) + or + exists(Language::Field field, TValueNumber objectAddress | + fieldAddressValueNumber(instr, irFunc, field, objectAddress) and + result = TFieldAddressValueNumber(irFunc, field, objectAddress) + ) + or + exists(Opcode opcode, TValueNumber leftOperand, TValueNumber rightOperand | + binaryValueNumber(instr, irFunc, opcode, leftOperand, rightOperand) and + result = TBinaryValueNumber(irFunc, opcode, leftOperand, rightOperand) + ) + or + exists(Opcode opcode, TValueNumber operand | + unaryValueNumber(instr, irFunc, opcode, operand) and + result = TUnaryValueNumber(irFunc, opcode, operand) ) + or + exists( + Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand + | + inheritanceConversionValueNumber(instr, irFunc, opcode, baseClass, derivedClass, operand) and + result = TInheritanceConversionValueNumber(irFunc, opcode, baseClass, derivedClass, operand) + ) + or + exists(Opcode opcode, int elementSize, TValueNumber leftOperand, TValueNumber rightOperand | + pointerArithmeticValueNumber(instr, irFunc, opcode, elementSize, leftOperand, rightOperand) and + result = TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand) + ) + or + exists(IRType type, TValueNumber memOperand, TValueNumber operand | + loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and + result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand) + ) + or + // The value number of a copy is just the value number of its source value. + result = tvalueNumber(instr.(CongruentCopyInstruction).getSourceValue()) + or + // The value number of a type-preserving conversion is just the value + // number of the unconverted value. + result = tvalueNumber(instr.(TypePreservingConvertInstruction).getUnary()) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll index 89efaa8e15af..7f7c5cd0a4da 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll @@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) { } module IRCfg implements BB::CfgSig { - class ControlFlowNode = Instruction; + private import codeql.controlflow.SuccessorType - class SuccessorType = EdgeKind; + class ControlFlowNode = Instruction; final private class FinalIRBlock = IRBlock; @@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) } + BasicBlock getASuccessor(SuccessorType t) { + exists(EdgeKind k | + result = super.getSuccessor(k) and + t = getAMatchingSuccessorType(k) + ) + } predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll index 66d499112b81..f4b5a850a1f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/gvn/internal/ValueNumberingInternal.qll @@ -41,7 +41,7 @@ newtype TValueNumber = ) { loadTotalOverlapValueNumber(_, irFunc, type, memOperand, operand) } or - TUniqueValueNumber(IRFunction irFunc, Instruction instr) { uniqueValueNumber(instr, irFunc) } + TUniqueValueNumber(Instruction instr) { uniqueValueNumber(instr) } /** * A `ConvertInstruction` which converts data of type `T` to data of type `U` @@ -129,12 +129,14 @@ private predicate filteredNumberableInstruction(Instruction instr) { count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 ) + or + count(instr.getEnclosingIRFunction()) != 1 } private predicate variableAddressValueNumber( VariableAddressInstruction instr, IRFunction irFunc, Language::AST ast ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. @@ -144,7 +146,7 @@ private predicate variableAddressValueNumber( private predicate initializeParameterValueNumber( InitializeParameterInstruction instr, IRFunction irFunc, Language::AST var ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. @@ -154,7 +156,7 @@ private predicate initializeParameterValueNumber( private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -162,7 +164,7 @@ private predicate constantValueNumber( private predicate stringConstantValueNumber( StringConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getResultIRType() = type and instr.getValue().getValue() = value } @@ -171,7 +173,7 @@ private predicate fieldAddressValueNumber( FieldAddressInstruction instr, IRFunction irFunc, Language::Field field, TValueNumber objectAddress ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -182,7 +184,7 @@ private predicate binaryValueNumber0( TValueNumber valueNumber ) { not instr instanceof PointerArithmeticInstruction and - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and ( isLeft = true and @@ -206,7 +208,7 @@ private predicate pointerArithmeticValueNumber0( PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize, boolean isLeft, TValueNumber valueNumber ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and instr.getElementSize() = elementSize and ( @@ -229,7 +231,7 @@ private predicate pointerArithmeticValueNumber( private predicate unaryValueNumber( UnaryInstruction instr, IRFunction irFunc, Opcode opcode, TValueNumber operand ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and not instr instanceof InheritanceConversionInstruction and not instr instanceof CopyInstruction and not instr instanceof FieldAddressInstruction and @@ -242,7 +244,7 @@ private predicate inheritanceConversionValueNumber( InheritanceConversionInstruction instr, IRFunction irFunc, Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and tvalueNumber(instr.getUnary()) = operand and unique( | | instr.getBaseClass()) = baseClass and @@ -254,7 +256,7 @@ private predicate loadTotalOverlapValueNumber0( LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber valueNumber, boolean isAddress ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getResultIRType() = type and ( isAddress = true and @@ -277,8 +279,7 @@ private predicate loadTotalOverlapValueNumber( * Holds if `instr` should be assigned a unique value number because this library does not know how * to determine if two instances of that instruction are equivalent. */ -private predicate uniqueValueNumber(Instruction instr, IRFunction irFunc) { - instr.getEnclosingIRFunction() = irFunc and +private predicate uniqueValueNumber(Instruction instr) { not instr.getResultIRType() instanceof IRVoidType and ( not numberableInstruction(instr) @@ -294,10 +295,8 @@ cached TValueNumber tvalueNumber(Instruction instr) { result = nonUniqueValueNumber(instr) or - exists(IRFunction irFunc | - uniqueValueNumber(instr, irFunc) and - result = TUniqueValueNumber(irFunc, instr) - ) + uniqueValueNumber(instr) and + result = TUniqueValueNumber(instr) } /** @@ -311,68 +310,64 @@ TValueNumber tvalueNumberOfOperand(Operand op) { result = tvalueNumber(op.getDef * value number. */ private TValueNumber nonUniqueValueNumber(Instruction instr) { - exists(IRFunction irFunc | - irFunc = instr.getEnclosingIRFunction() and - ( - exists(Language::AST ast | - variableAddressValueNumber(instr, irFunc, ast) and - result = TVariableAddressValueNumber(irFunc, ast) - ) - or - exists(Language::AST var | - initializeParameterValueNumber(instr, irFunc, var) and - result = TInitializeParameterValueNumber(irFunc, var) - ) - or - exists(string value, IRType type | - constantValueNumber(instr, irFunc, type, value) and - result = TConstantValueNumber(irFunc, type, value) - ) - or - exists(IRType type, string value | - stringConstantValueNumber(instr, irFunc, type, value) and - result = TStringConstantValueNumber(irFunc, type, value) - ) - or - exists(Language::Field field, TValueNumber objectAddress | - fieldAddressValueNumber(instr, irFunc, field, objectAddress) and - result = TFieldAddressValueNumber(irFunc, field, objectAddress) - ) - or - exists(Opcode opcode, TValueNumber leftOperand, TValueNumber rightOperand | - binaryValueNumber(instr, irFunc, opcode, leftOperand, rightOperand) and - result = TBinaryValueNumber(irFunc, opcode, leftOperand, rightOperand) - ) - or - exists(Opcode opcode, TValueNumber operand | - unaryValueNumber(instr, irFunc, opcode, operand) and - result = TUnaryValueNumber(irFunc, opcode, operand) - ) - or - exists( - Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand - | - inheritanceConversionValueNumber(instr, irFunc, opcode, baseClass, derivedClass, operand) and - result = TInheritanceConversionValueNumber(irFunc, opcode, baseClass, derivedClass, operand) - ) - or - exists(Opcode opcode, int elementSize, TValueNumber leftOperand, TValueNumber rightOperand | - pointerArithmeticValueNumber(instr, irFunc, opcode, elementSize, leftOperand, rightOperand) and - result = - TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand) - ) - or - exists(IRType type, TValueNumber memOperand, TValueNumber operand | - loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and - result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand) - ) - or - // The value number of a copy is just the value number of its source value. - result = tvalueNumber(instr.(CongruentCopyInstruction).getSourceValue()) - or - // The value number of a type-preserving conversion is just the value - // number of the unconverted value. - result = tvalueNumber(instr.(TypePreservingConvertInstruction).getUnary()) + exists(IRFunction irFunc | irFunc = instr.getEnclosingIRFunction() | + exists(Language::AST ast | + variableAddressValueNumber(instr, irFunc, ast) and + result = TVariableAddressValueNumber(irFunc, ast) + ) + or + exists(Language::AST var | + initializeParameterValueNumber(instr, irFunc, var) and + result = TInitializeParameterValueNumber(irFunc, var) + ) + or + exists(string value, IRType type | + constantValueNumber(instr, irFunc, type, value) and + result = TConstantValueNumber(irFunc, type, value) + ) + or + exists(IRType type, string value | + stringConstantValueNumber(instr, irFunc, type, value) and + result = TStringConstantValueNumber(irFunc, type, value) + ) + or + exists(Language::Field field, TValueNumber objectAddress | + fieldAddressValueNumber(instr, irFunc, field, objectAddress) and + result = TFieldAddressValueNumber(irFunc, field, objectAddress) + ) + or + exists(Opcode opcode, TValueNumber leftOperand, TValueNumber rightOperand | + binaryValueNumber(instr, irFunc, opcode, leftOperand, rightOperand) and + result = TBinaryValueNumber(irFunc, opcode, leftOperand, rightOperand) + ) + or + exists(Opcode opcode, TValueNumber operand | + unaryValueNumber(instr, irFunc, opcode, operand) and + result = TUnaryValueNumber(irFunc, opcode, operand) ) + or + exists( + Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand + | + inheritanceConversionValueNumber(instr, irFunc, opcode, baseClass, derivedClass, operand) and + result = TInheritanceConversionValueNumber(irFunc, opcode, baseClass, derivedClass, operand) + ) + or + exists(Opcode opcode, int elementSize, TValueNumber leftOperand, TValueNumber rightOperand | + pointerArithmeticValueNumber(instr, irFunc, opcode, elementSize, leftOperand, rightOperand) and + result = TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand) + ) + or + exists(IRType type, TValueNumber memOperand, TValueNumber operand | + loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and + result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand) + ) + or + // The value number of a copy is just the value number of its source value. + result = tvalueNumber(instr.(CongruentCopyInstruction).getSourceValue()) + or + // The value number of a type-preserving conversion is just the value + // number of the unconverted value. + result = tvalueNumber(instr.(TypePreservingConvertInstruction).getUnary()) ) } 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 d864e86aa040..be3f680aa16d 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 @@ -97,7 +97,14 @@ newtype TInstructionTag = exists(Stmt s | exists(s.getImplicitDestructorCall(index))) } or CoAwaitBranchTag() or - BoolToIntConversionTag() + BoolToIntConversionTag() or + SizeofVlaBaseSizeTag() or + SizeofVlaConversionTag(int index) { + exists(VlaDeclStmt v | exists(v.getTransitiveVlaDimensionStmt(index))) + } or + SizeofVlaDimensionTag(int index) { + exists(VlaDeclStmt v | exists(v.getTransitiveVlaDimensionStmt(index))) + } class InstructionTag extends TInstructionTag { final string toString() { result = getInstructionTagId(this) } 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 e1314035437e..330362f55603 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 @@ -123,13 +123,16 @@ private predicate ignoreExprAndDescendants(Expr expr) { // or ignoreExprAndDescendants(getRealParent(expr)) // recursive case or - // va_start doesn't evaluate its argument, so we don't need to translate it. + // va_start does not evaluate its argument, so we do not need to translate it. exists(BuiltInVarArgsStart vaStartExpr | vaStartExpr.getLastNamedParameter().getFullyConverted() = expr ) or + // sizeof does not evaluate its argument, so we do not need to translate it. + exists(SizeofExprOperator sizeofExpr | sizeofExpr.getExprOperand().getFullyConverted() = expr) + or // The children of C11 _Generic expressions are just surface syntax. - exists(C11GenericExpr generic | generic.getAChild() = expr) + exists(C11GenericExpr generic | generic.getAChild().getFullyConverted() = expr) or // Do not translate implicit destructor calls for unnamed temporary variables that are // conditionally constructed (until we have a mechanism for calling these only when the 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 f749f8b7502c..6024a881c5fc 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 @@ -187,7 +187,7 @@ Variable getEnclosingVariable(Expr e) { } /** - * The IR translation of the "core" part of an expression. This is the part of + * The IR translation of the "core" part of an expression. This is the part of * the expression that produces the result value of the expression, before any * lvalue-to-rvalue conversion on the result. Every expression has a single * `TranslatedCoreExpr`. @@ -4094,6 +4094,155 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr { TranslatedStmt getStmt() { result = getTranslatedStmt(expr.getStmt()) } } +private VlaDeclStmt getVlaDeclStmt(Expr expr, int pointerDerefCount) { + expr.(VariableAccess).getTarget() = result.getVariable() and + pointerDerefCount = 0 + or + not expr.(PointerDereferenceExpr).getOperand() instanceof AddressOfExpr and + result = getVlaDeclStmt(expr.(PointerDereferenceExpr).getOperand(), pointerDerefCount - 1) + or + // Skip sequences of the form `*&...` + result = + getVlaDeclStmt(expr.(PointerDereferenceExpr).getOperand().(AddressOfExpr).getOperand(), + pointerDerefCount) + or + result = getVlaDeclStmt(expr.(ArrayExpr).getArrayBase(), pointerDerefCount - 1) +} + +/** + * The IR translation of `SizeofExprOperator` when its result is non-constant, i.e., + * when the operand expression refers to a variable length array. + */ +class TranslatedSizeofExpr extends TranslatedNonConstantExpr { + override SizeofExprOperator expr; + VlaDeclStmt vlaDeclStmt; + int vlaDimensions; + int pointerDerefCount; + + TranslatedSizeofExpr() { + vlaDeclStmt = getVlaDeclStmt(expr.getExprOperand(), pointerDerefCount) and + vlaDimensions = vlaDeclStmt.getTransitiveNumberOfVlaDimensionStmts() and + pointerDerefCount < vlaDimensions + } + + final override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getInstruction(SizeofVlaBaseSizeTag()) and + kind instanceof GotoEdge + } + + override Instruction getALastInstructionInternal() { + result = this.getInstruction(SizeofVlaDimensionTag(vlaDimensions - 1)) + } + + final override TranslatedElement getChildInternal(int id) { none() } + + final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + opcode instanceof Opcode::Constant and + tag = SizeofVlaBaseSizeTag() and + resultType = this.getResultType() + or + exists(int n, Type dimType | + pointerDerefCount <= n and + n < vlaDimensions and + dimType = this.getDimensionExpr(n).getUnderlyingType() and + tag = SizeofVlaConversionTag(n) + | + ( + expr.getUnderlyingType() = dimType and + opcode instanceof Opcode::CopyValue + or + not expr.getUnderlyingType() = dimType and + opcode instanceof Opcode::Convert + ) + ) and + resultType = this.getResultType() + or + opcode instanceof Opcode::Mul and + exists(int n | pointerDerefCount <= n and n < vlaDimensions | tag = SizeofVlaDimensionTag(n)) and + resultType = this.getResultType() + } + + final override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { + tag = SizeofVlaBaseSizeTag() and + result = this.getInstruction(SizeofVlaConversionTag(pointerDerefCount)) and + kind instanceof GotoEdge + or + exists(int n | pointerDerefCount <= n and n < vlaDimensions | + tag = SizeofVlaConversionTag(n) and + result = this.getInstruction(SizeofVlaDimensionTag(n)) + ) and + kind instanceof GotoEdge + or + exists(int n | pointerDerefCount <= n and n < vlaDimensions - 1 | + tag = SizeofVlaDimensionTag(n) and + result = this.getInstruction(SizeofVlaConversionTag(n + 1)) + ) and + kind instanceof GotoEdge + or + tag = SizeofVlaDimensionTag(vlaDimensions - 1) and + result = this.getParent().getChildSuccessor(this, kind) + } + + override string getInstructionConstantValue(InstructionTag tag) { + tag = SizeofVlaBaseSizeTag() and + result = this.getBaseType(vlaDeclStmt).getSize().toString() + } + + private Type getBaseType(VlaDeclStmt v) { + not exists(v.getParentVlaDecl()) and + ( + result = + this.getBaseType(v.getVariable().getUnderlyingType(), v.getNumberOfVlaDimensionStmts()) + or + result = this.getBaseType(v.getType().getUnderlyingType(), v.getNumberOfVlaDimensionStmts()) + ) + or + result = this.getBaseType(v.getParentVlaDecl()) + } + + private Type getBaseType(Type type, int n) { + n = 0 and + result = type + or + result = this.getBaseType(type.(DerivedType).getBaseType(), n - 1) + } + + override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { + exists(int n | pointerDerefCount <= n and n < vlaDimensions | + tag = SizeofVlaConversionTag(n) and + ( + operandTag instanceof UnaryOperandTag and + result = getTranslatedExpr(this.getDimensionExpr(n)).getResult() + ) + ) + or + exists(int n | pointerDerefCount <= n and n < vlaDimensions | + tag = SizeofVlaDimensionTag(n) and + ( + operandTag instanceof LeftOperandTag and + ( + n - 1 >= pointerDerefCount and + result = this.getInstruction(SizeofVlaDimensionTag(n - 1)) + or + n - 1 < pointerDerefCount and + result = this.getInstruction(SizeofVlaBaseSizeTag()) + ) + or + operandTag instanceof RightOperandTag and + result = this.getInstruction(SizeofVlaConversionTag(n)) + ) + ) + } + + private Expr getDimensionExpr(int n) { + result = vlaDeclStmt.getTransitiveVlaDimensionStmt(n).getDimensionExpr().getFullyConverted() + } + + final override Instruction getResult() { + result = this.getInstruction(SizeofVlaDimensionTag(vlaDimensions - 1)) + } +} + class TranslatedErrorExpr extends TranslatedSingleInstructionExpr { override ErrorExpr expr; 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 83736ae98d04..26f5393db103 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 @@ -50,7 +50,7 @@ CppType getEllipsisVariablePRValueType() { CppType getEllipsisVariableGLValueType() { result = getTypeForGLValue(any(UnknownType t)) } /** - * Holds if the function returns a value, as opposed to returning `void`. + * Holds if the function `func` returns a value, as opposed to returning `void`. */ predicate hasReturnValue(Function func) { not func.getUnspecifiedType() instanceof VoidType } 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 3914c5e8e597..9dccf7752aa8 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 @@ -601,7 +601,7 @@ class TranslatedReturnVoidStmt extends TranslatedReturnStmt { * The IR translation of an implicit `return` statement generated by the extractor to handle control * flow that reaches the end of a non-`void`-returning function body. Such control flow * produces undefined behavior in C++ but not in C. However even in C using the return value is - * undefined behaviour. We make it return uninitialized memory to get as much flow as possible. + * undefined behavior. We make it return uninitialized memory to get as much flow as possible. */ class TranslatedNoValueReturnStmt extends TranslatedReturnStmt, TranslatedVariableInitialization { TranslatedNoValueReturnStmt() { diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll index 89efaa8e15af..7f7c5cd0a4da 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll @@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) { } module IRCfg implements BB::CfgSig { - class ControlFlowNode = Instruction; + private import codeql.controlflow.SuccessorType - class SuccessorType = EdgeKind; + class ControlFlowNode = Instruction; final private class FinalIRBlock = IRBlock; @@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) } + BasicBlock getASuccessor(SuccessorType t) { + exists(EdgeKind k | + result = super.getSuccessor(k) and + t = getAMatchingSuccessorType(k) + ) + } predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll index 66d499112b81..f4b5a850a1f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/gvn/internal/ValueNumberingInternal.qll @@ -41,7 +41,7 @@ newtype TValueNumber = ) { loadTotalOverlapValueNumber(_, irFunc, type, memOperand, operand) } or - TUniqueValueNumber(IRFunction irFunc, Instruction instr) { uniqueValueNumber(instr, irFunc) } + TUniqueValueNumber(Instruction instr) { uniqueValueNumber(instr) } /** * A `ConvertInstruction` which converts data of type `T` to data of type `U` @@ -129,12 +129,14 @@ private predicate filteredNumberableInstruction(Instruction instr) { count(instr.(InheritanceConversionInstruction).getBaseClass()) != 1 or count(instr.(InheritanceConversionInstruction).getDerivedClass()) != 1 ) + or + count(instr.getEnclosingIRFunction()) != 1 } private predicate variableAddressValueNumber( VariableAddressInstruction instr, IRFunction irFunc, Language::AST ast ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. @@ -144,7 +146,7 @@ private predicate variableAddressValueNumber( private predicate initializeParameterValueNumber( InitializeParameterInstruction instr, IRFunction irFunc, Language::AST var ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and // The underlying AST element is used as value-numbering key instead of the // `IRVariable` to work around a problem where a variable or expression with // multiple types gives rise to multiple `IRVariable`s. @@ -154,7 +156,7 @@ private predicate initializeParameterValueNumber( private predicate constantValueNumber( ConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and unique( | | instr.getResultIRType()) = type and instr.getValue() = value } @@ -162,7 +164,7 @@ private predicate constantValueNumber( private predicate stringConstantValueNumber( StringConstantInstruction instr, IRFunction irFunc, IRType type, string value ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getResultIRType() = type and instr.getValue().getValue() = value } @@ -171,7 +173,7 @@ private predicate fieldAddressValueNumber( FieldAddressInstruction instr, IRFunction irFunc, Language::Field field, TValueNumber objectAddress ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and unique( | | instr.getField()) = field and tvalueNumber(instr.getObjectAddress()) = objectAddress } @@ -182,7 +184,7 @@ private predicate binaryValueNumber0( TValueNumber valueNumber ) { not instr instanceof PointerArithmeticInstruction and - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and ( isLeft = true and @@ -206,7 +208,7 @@ private predicate pointerArithmeticValueNumber0( PointerArithmeticInstruction instr, IRFunction irFunc, Opcode opcode, int elementSize, boolean isLeft, TValueNumber valueNumber ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and instr.getElementSize() = elementSize and ( @@ -229,7 +231,7 @@ private predicate pointerArithmeticValueNumber( private predicate unaryValueNumber( UnaryInstruction instr, IRFunction irFunc, Opcode opcode, TValueNumber operand ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and not instr instanceof InheritanceConversionInstruction and not instr instanceof CopyInstruction and not instr instanceof FieldAddressInstruction and @@ -242,7 +244,7 @@ private predicate inheritanceConversionValueNumber( InheritanceConversionInstruction instr, IRFunction irFunc, Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getOpcode() = opcode and tvalueNumber(instr.getUnary()) = operand and unique( | | instr.getBaseClass()) = baseClass and @@ -254,7 +256,7 @@ private predicate loadTotalOverlapValueNumber0( LoadTotalOverlapInstruction instr, IRFunction irFunc, IRType type, TValueNumber valueNumber, boolean isAddress ) { - instr.getEnclosingIRFunction() = irFunc and + unique( | | instr.getEnclosingIRFunction()) = irFunc and instr.getResultIRType() = type and ( isAddress = true and @@ -277,8 +279,7 @@ private predicate loadTotalOverlapValueNumber( * Holds if `instr` should be assigned a unique value number because this library does not know how * to determine if two instances of that instruction are equivalent. */ -private predicate uniqueValueNumber(Instruction instr, IRFunction irFunc) { - instr.getEnclosingIRFunction() = irFunc and +private predicate uniqueValueNumber(Instruction instr) { not instr.getResultIRType() instanceof IRVoidType and ( not numberableInstruction(instr) @@ -294,10 +295,8 @@ cached TValueNumber tvalueNumber(Instruction instr) { result = nonUniqueValueNumber(instr) or - exists(IRFunction irFunc | - uniqueValueNumber(instr, irFunc) and - result = TUniqueValueNumber(irFunc, instr) - ) + uniqueValueNumber(instr) and + result = TUniqueValueNumber(instr) } /** @@ -311,68 +310,64 @@ TValueNumber tvalueNumberOfOperand(Operand op) { result = tvalueNumber(op.getDef * value number. */ private TValueNumber nonUniqueValueNumber(Instruction instr) { - exists(IRFunction irFunc | - irFunc = instr.getEnclosingIRFunction() and - ( - exists(Language::AST ast | - variableAddressValueNumber(instr, irFunc, ast) and - result = TVariableAddressValueNumber(irFunc, ast) - ) - or - exists(Language::AST var | - initializeParameterValueNumber(instr, irFunc, var) and - result = TInitializeParameterValueNumber(irFunc, var) - ) - or - exists(string value, IRType type | - constantValueNumber(instr, irFunc, type, value) and - result = TConstantValueNumber(irFunc, type, value) - ) - or - exists(IRType type, string value | - stringConstantValueNumber(instr, irFunc, type, value) and - result = TStringConstantValueNumber(irFunc, type, value) - ) - or - exists(Language::Field field, TValueNumber objectAddress | - fieldAddressValueNumber(instr, irFunc, field, objectAddress) and - result = TFieldAddressValueNumber(irFunc, field, objectAddress) - ) - or - exists(Opcode opcode, TValueNumber leftOperand, TValueNumber rightOperand | - binaryValueNumber(instr, irFunc, opcode, leftOperand, rightOperand) and - result = TBinaryValueNumber(irFunc, opcode, leftOperand, rightOperand) - ) - or - exists(Opcode opcode, TValueNumber operand | - unaryValueNumber(instr, irFunc, opcode, operand) and - result = TUnaryValueNumber(irFunc, opcode, operand) - ) - or - exists( - Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand - | - inheritanceConversionValueNumber(instr, irFunc, opcode, baseClass, derivedClass, operand) and - result = TInheritanceConversionValueNumber(irFunc, opcode, baseClass, derivedClass, operand) - ) - or - exists(Opcode opcode, int elementSize, TValueNumber leftOperand, TValueNumber rightOperand | - pointerArithmeticValueNumber(instr, irFunc, opcode, elementSize, leftOperand, rightOperand) and - result = - TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand) - ) - or - exists(IRType type, TValueNumber memOperand, TValueNumber operand | - loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and - result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand) - ) - or - // The value number of a copy is just the value number of its source value. - result = tvalueNumber(instr.(CongruentCopyInstruction).getSourceValue()) - or - // The value number of a type-preserving conversion is just the value - // number of the unconverted value. - result = tvalueNumber(instr.(TypePreservingConvertInstruction).getUnary()) + exists(IRFunction irFunc | irFunc = instr.getEnclosingIRFunction() | + exists(Language::AST ast | + variableAddressValueNumber(instr, irFunc, ast) and + result = TVariableAddressValueNumber(irFunc, ast) + ) + or + exists(Language::AST var | + initializeParameterValueNumber(instr, irFunc, var) and + result = TInitializeParameterValueNumber(irFunc, var) + ) + or + exists(string value, IRType type | + constantValueNumber(instr, irFunc, type, value) and + result = TConstantValueNumber(irFunc, type, value) + ) + or + exists(IRType type, string value | + stringConstantValueNumber(instr, irFunc, type, value) and + result = TStringConstantValueNumber(irFunc, type, value) + ) + or + exists(Language::Field field, TValueNumber objectAddress | + fieldAddressValueNumber(instr, irFunc, field, objectAddress) and + result = TFieldAddressValueNumber(irFunc, field, objectAddress) + ) + or + exists(Opcode opcode, TValueNumber leftOperand, TValueNumber rightOperand | + binaryValueNumber(instr, irFunc, opcode, leftOperand, rightOperand) and + result = TBinaryValueNumber(irFunc, opcode, leftOperand, rightOperand) + ) + or + exists(Opcode opcode, TValueNumber operand | + unaryValueNumber(instr, irFunc, opcode, operand) and + result = TUnaryValueNumber(irFunc, opcode, operand) ) + or + exists( + Opcode opcode, Language::Class baseClass, Language::Class derivedClass, TValueNumber operand + | + inheritanceConversionValueNumber(instr, irFunc, opcode, baseClass, derivedClass, operand) and + result = TInheritanceConversionValueNumber(irFunc, opcode, baseClass, derivedClass, operand) + ) + or + exists(Opcode opcode, int elementSize, TValueNumber leftOperand, TValueNumber rightOperand | + pointerArithmeticValueNumber(instr, irFunc, opcode, elementSize, leftOperand, rightOperand) and + result = TPointerArithmeticValueNumber(irFunc, opcode, elementSize, leftOperand, rightOperand) + ) + or + exists(IRType type, TValueNumber memOperand, TValueNumber operand | + loadTotalOverlapValueNumber(instr, irFunc, type, memOperand, operand) and + result = TLoadTotalOverlapValueNumber(irFunc, type, memOperand, operand) + ) + or + // The value number of a copy is just the value number of its source value. + result = tvalueNumber(instr.(CongruentCopyInstruction).getSourceValue()) + or + // The value number of a type-preserving conversion is just the value + // number of the unconverted value. + result = tvalueNumber(instr.(TypePreservingConvertInstruction).getUnary()) ) } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll index bfd850384aca..c42f734a62ac 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/internal/IRUtilities.qll @@ -49,7 +49,8 @@ Type getVariableType(Variable v) { } /** - * Holds if the database contains a `case` label with the specified minimum and maximum value. + * Holds if the database contains a `switchCase` label with the specified minimum `minValue` + * and maximum `maxValue` value. */ predicate hasCaseEdge(SwitchCase switchCase, string minValue, string maxValue) { minValue = switchCase.getExpr().getFullyConverted().getValue() and diff --git a/cpp/ql/lib/semmle/code/cpp/models/interfaces/FunctionInputsAndOutputs.qll b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FunctionInputsAndOutputs.qll index 9c8ee43b52a6..d81bc960988c 100644 --- a/cpp/ql/lib/semmle/code/cpp/models/interfaces/FunctionInputsAndOutputs.qll +++ b/cpp/ql/lib/semmle/code/cpp/models/interfaces/FunctionInputsAndOutputs.qll @@ -371,7 +371,7 @@ class FunctionOutput extends TFunctionOutput { /** * Holds if this is the output value pointed to by a pointer parameter to a function, or the * output value referred to by a reference parameter to a function, where the parameter has - * index `index`. + * index `i`. * * Example: * ``` @@ -389,7 +389,7 @@ class FunctionOutput extends TFunctionOutput { /** * Holds if this is the output value pointed to by a pointer parameter (through `ind` number * of indirections) to a function, or the output value referred to by a reference parameter to - * a function, where the parameter has index `index`. + * a function, where the parameter has index `i`. * * Example: * ``` diff --git a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/SemanticExpr.qll b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/SemanticExpr.qll index 668d9b52659e..f269d0dfff2d 100644 --- a/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/SemanticExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/rangeanalysis/new/internal/semantic/SemanticExpr.qll @@ -307,13 +307,12 @@ class SemStoreExpr extends SemUnaryExpr { } class SemConditionalExpr extends SemKnownExpr { - SemExpr condition; SemExpr trueResult; SemExpr falseResult; SemConditionalExpr() { opcode instanceof Opcode::Conditional and - Specific::conditionalExpr(this, type, condition, trueResult, falseResult) + Specific::conditionalExpr(this, type, any(SemExpr condition), trueResult, falseResult) } final SemExpr getBranchExpr(boolean branch) { diff --git a/cpp/ql/lib/semmle/code/cpp/security/FileWrite.qll b/cpp/ql/lib/semmle/code/cpp/security/FileWrite.qll index dc421e8f3aee..6c0552a7d188 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/FileWrite.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/FileWrite.qll @@ -21,7 +21,9 @@ class FileWrite extends Expr { Expr getDest() { fileWrite(this, _, result) } /** - * Gets the conversion character for this write, if it exists and is known. For example in the following code the write of `value1` has conversion character `"s"`, whereas the write of `value2` has no conversion specifier. + * Gets the conversion character from `source` for this write, if it exists and is known. + * For example in the following code the write of `value1` has conversion character `"s"`, whereas + * the write of `value2` has no conversion specifier. * ``` * fprintf(file, "%s", value1); * stream << value2; diff --git a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll index 559ebd444f32..984bd874ae51 100644 --- a/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll +++ b/cpp/ql/lib/semmle/code/cpp/security/boostorg/asio/protocols.qll @@ -191,11 +191,19 @@ module BoostorgAsio { class SslContextClass extends Class { SslContextClass() { this.getQualifiedName() = "boost::asio::ssl::context" } - ConstructorCall getAContructorCall() { + /** + * Gets a constructor call, if any. + */ + ConstructorCall getAConstructorCall() { this.getAConstructor().getACallToThisFunction() = result and not result.getLocation().getFile().toString().matches("%/boost/asio/%") and result.fromSource() } + + /** + * DEPRECATED: Use `getAConstructorCall` instead. + */ + deprecated ConstructorCall getAContructorCall() { result = this.getAConstructorCall() } } /** @@ -368,7 +376,7 @@ module BoostorgAsio { */ default predicate isSink(DataFlow::Node sink) { exists(ConstructorCall cc, SslContextClass c, Expr e | e = sink.asExpr() | - c.getAContructorCall() = cc and + c.getAConstructorCall() = cc and cc.getArgument(0) = e ) } @@ -468,7 +476,7 @@ module BoostorgAsio { predicate isSource(DataFlow::Node source) { exists(SslContextClass c, ConstructorCall cc | cc = source.asExpr() and - c.getAContructorCall() = cc + c.getAConstructorCall() = cc ) } diff --git a/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll b/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll index 5305c8ca58f6..bd3a54c61594 100644 --- a/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/stmts/Stmt.qll @@ -2355,6 +2355,20 @@ class VlaDeclStmt extends Stmt, @stmt_vla_decl { ) } + /** + * Gets the number of VLA dimension statements in this VLA declaration + * statement and transitively of the VLA declaration used to define its + * base type. if any. + */ + int getTransitiveNumberOfVlaDimensionStmts() { + not exists(this.getParentVlaDecl()) and + result = this.getNumberOfVlaDimensionStmts() + or + result = + this.getNumberOfVlaDimensionStmts() + + this.getParentVlaDecl().getTransitiveNumberOfVlaDimensionStmts() + } + /** * Gets the `i`th VLA dimension statement in this VLA * declaration statement. @@ -2367,6 +2381,19 @@ class VlaDeclStmt extends Stmt, @stmt_vla_decl { ) } + /** + * Gets the `i`th VLA dimension statement in this VLA declaration + * statement or transitively of the VLA declaration used to define + * its base type. + */ + VlaDimensionStmt getTransitiveVlaDimensionStmt(int i) { + i < this.getNumberOfVlaDimensionStmts() and + result = this.getVlaDimensionStmt(i) + or + result = + this.getParentVlaDecl().getTransitiveVlaDimensionStmt(i - this.getNumberOfVlaDimensionStmts()) + } + /** * Gets the type that this VLA declaration statement relates to, * if any. @@ -2378,4 +2405,31 @@ class VlaDeclStmt extends Stmt, @stmt_vla_decl { * if any. */ Variable getVariable() { variable_vla(unresolveElement(result), underlyingElement(this)) } + + /** + * Get the VLA declaration used to define the base type of + * this VLA declaration, if any. + */ + VlaDeclStmt getParentVlaDecl() { + exists(Variable v, Type baseType | + v = this.getVariable() and + baseType = this.getBaseType(v.getType(), this.getNumberOfVlaDimensionStmts()) + | + result.getType() = baseType + ) + or + exists(Type t, Type baseType | + t = this.getType().(TypedefType).getBaseType() and + baseType = this.getBaseType(t, this.getNumberOfVlaDimensionStmts()) + | + result.getType() = baseType + ) + } + + private Type getBaseType(Type type, int n) { + n = 0 and + result = type + or + result = this.getBaseType(type.(DerivedType).getBaseType(), n - 1) + } } diff --git a/cpp/ql/src/Best Practices/Magic Constants/MagicConstants.qll b/cpp/ql/src/Best Practices/Magic Constants/MagicConstants.qll index 53e33ab4fa56..033840764830 100644 --- a/cpp/ql/src/Best Practices/Magic Constants/MagicConstants.qll +++ b/cpp/ql/src/Best Practices/Magic Constants/MagicConstants.qll @@ -164,12 +164,17 @@ predicate valueOccurrenceCount(string value, int n) { n > 20 } -predicate occurenceCount(Literal lit, string value, int n) { +predicate occurrenceCount(Literal lit, string value, int n) { valueOccurrenceCount(value, n) and value = lit.getValue() and nonTrivialValue(_, lit) } +/** + * DEPRECATED: Use `occurrenceCount` instead. + */ +deprecated predicate occurenceCount = occurrenceCount/3; + /* * Literals repeated frequently */ @@ -178,7 +183,7 @@ predicate check(Literal lit, string value, int n, File f) { // Check that the literal is nontrivial not trivial(lit) and // Check that it is repeated a number of times - occurenceCount(lit, value, n) and + occurrenceCount(lit, value, n) and n > 20 and f = lit.getFile() and // Exclude generated files diff --git a/cpp/ql/src/CHANGELOG.md b/cpp/ql/src/CHANGELOG.md index eb805dc1af6e..0cafbd23191b 100644 --- a/cpp/ql/src/CHANGELOG.md +++ b/cpp/ql/src/CHANGELOG.md @@ -1,3 +1,15 @@ +## 1.5.0 + +### Major Analysis Improvements + +* The queries `cpp/wrong-type-format-argument`, `cpp/comparison-with-wider-type`, `cpp/integer-multiplication-cast-to-long`, `cpp/implicit-function-declaration` and `cpp/suspicious-add-sizeof` have had their precisions reduced from `high` to `medium`. They will also now give alerts for projects built with `build-mode: none`. +* The queries `cpp/wrong-type-format-argument`, `cpp/comparison-with-wider-type`, `cpp/integer-multiplication-cast-to-long` and `cpp/suspicious-add-sizeof` are no longer included in the `code-scanning` suite. + +### Bug Fixes + +* The predicate `occurenceCount` in the file module `MagicConstants` has been deprecated. Use `occurrenceCount` instead. +* The predicate `additionalAdditionOrSubstractionCheckForLeapYear` in the file module `LeapYear` has been deprecated. Use `additionalAdditionOrSubtractionCheckForLeapYear` instead. + ## 1.4.7 ### Bug Fixes diff --git a/cpp/ql/src/Critical/ScanfChecks.qll b/cpp/ql/src/Critical/ScanfChecks.qll index 340c52a3b938..0e191cc833cf 100644 --- a/cpp/ql/src/Critical/ScanfChecks.qll +++ b/cpp/ql/src/Critical/ScanfChecks.qll @@ -4,13 +4,9 @@ private import semmle.code.cpp.controlflow.IRGuards private import semmle.code.cpp.ir.ValueNumbering private predicate exprInBooleanContext(Expr e) { - exists(IRGuardCondition gc | - exists(Instruction i | - i.getUnconvertedResultExpression() = e and - gc.comparesEq(valueNumber(i).getAUse(), 0, _, _) - ) - or - gc.getUnconvertedResultExpression() = e + exists(IRGuardCondition gc, Instruction i | + i.getUnconvertedResultExpression() = e and + gc.comparesEq(valueNumber(i).getAUse(), 0, _, _) ) } @@ -36,20 +32,18 @@ private string getEofValue() { * Holds if the value of `call` has been checked to not equal `EOF`. */ private predicate checkedForEof(ScanfFunctionCall call) { - exists(IRGuardCondition gc | - exists(CallInstruction i | i.getUnconvertedResultExpression() = call | - exists(int val | gc.comparesEq(valueNumber(i).getAUse(), val, _, _) | - // call == EOF - val = getEofValue().toInt() - or - // call == [any positive number] - val > 0 - ) + exists(IRGuardCondition gc, CallInstruction i | i.getUnconvertedResultExpression() = call | + exists(int val | gc.comparesEq(valueNumber(i).getAUse(), val, _, _) | + // call == EOF + val = getEofValue().toInt() or - exists(int val | gc.comparesLt(valueNumber(i).getAUse(), val, true, _) | - // call < [any non-negative number] (EOF is guaranteed to be negative) - val >= 0 - ) + // call == [any positive number] + val > 0 + ) + or + exists(int val | gc.comparesLt(valueNumber(i).getAUse(), val, true, _) | + // call < [any non-negative number] (EOF is guaranteed to be negative) + val >= 0 ) ) } diff --git a/cpp/ql/src/Likely Bugs/Arithmetic/IntMultToLong.ql b/cpp/ql/src/Likely Bugs/Arithmetic/IntMultToLong.ql index 7eb465d35a92..a54ac9020c8c 100644 --- a/cpp/ql/src/Likely Bugs/Arithmetic/IntMultToLong.ql +++ b/cpp/ql/src/Likely Bugs/Arithmetic/IntMultToLong.ql @@ -5,7 +5,7 @@ * @kind problem * @problem.severity warning * @security-severity 8.1 - * @precision high + * @precision medium * @id cpp/integer-multiplication-cast-to-long * @tags reliability * security @@ -179,7 +179,6 @@ predicate overflows(MulExpr me, Type t) { from MulExpr me, Type t1, Type t2 where - not any(Compilation c).buildModeNone() and t1 = me.getType().getUnderlyingType() and t2 = me.getConversion().getType().getUnderlyingType() and t1.getSize() < t2.getSize() and diff --git a/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.ql b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.ql index 02975d2bdcab..33fe3a0b7a15 100644 --- a/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.ql +++ b/cpp/ql/src/Likely Bugs/Format/WrongTypeFormatArguments.ql @@ -5,7 +5,7 @@ * @kind problem * @problem.severity error * @security-severity 7.5 - * @precision high + * @precision medium * @id cpp/wrong-type-format-argument * @tags reliability * correctness @@ -154,7 +154,6 @@ int sizeof_IntType() { exists(IntType it | result = it.getSize()) } from FormattingFunctionCall ffc, int n, Expr arg, Type expected, Type actual where - not any(Compilation c).buildModeNone() and ( formattingFunctionCallExpectedType(ffc, n, expected) and formattingFunctionCallActualType(ffc, n, arg, actual) and diff --git a/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll b/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll index 1d0636f98c75..06b6aff66abd 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll +++ b/cpp/ql/src/Likely Bugs/Leap Year/LeapYear.qll @@ -352,11 +352,18 @@ abstract class LeapYearFieldAccess extends YearFieldAccess { /** * Holds if the top-level binary operation includes an addition or subtraction operator with an operand specified by `valueToCheck`. */ - predicate additionalAdditionOrSubstractionCheckForLeapYear(int valueToCheck) { + predicate additionalAdditionOrSubtractionCheckForLeapYear(int valueToCheck) { additionalLogicalCheck(this, "+", valueToCheck) or additionalLogicalCheck(this, "-", valueToCheck) } + /** + * DEPRECATED: Use `additionalAdditionOrSubtractionCheckForLeapYear` instead. + */ + deprecated predicate additionalAdditionOrSubstractionCheckForLeapYear(int valueToCheck) { + this.additionalAdditionOrSubtractionCheckForLeapYear(valueToCheck) + } + /** * Holds if this object is used on a modulus 4 operation, which would likely indicate the start of a leap year check. */ diff --git a/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql b/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql index f5d1a09d04e9..e50a2d545431 100644 --- a/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql +++ b/cpp/ql/src/Likely Bugs/Protocols/TlsSettingsMisconfiguration.ql @@ -14,7 +14,7 @@ import cpp import semmle.code.cpp.security.boostorg.asio.protocols predicate isSourceImpl(DataFlow::Node source, ConstructorCall cc) { - exists(BoostorgAsio::SslContextClass c | c.getAContructorCall() = cc and cc = source.asExpr()) + exists(BoostorgAsio::SslContextClass c | c.getAConstructorCall() = cc and cc = source.asExpr()) } predicate isSinkImpl(DataFlow::Node sink, FunctionCall fcSetOptions) { diff --git a/cpp/ql/src/Likely Bugs/Underspecified Functions/ImplicitFunctionDeclaration.ql b/cpp/ql/src/Likely Bugs/Underspecified Functions/ImplicitFunctionDeclaration.ql index aa9d5d43c738..6a55557cf70b 100644 --- a/cpp/ql/src/Likely Bugs/Underspecified Functions/ImplicitFunctionDeclaration.ql +++ b/cpp/ql/src/Likely Bugs/Underspecified Functions/ImplicitFunctionDeclaration.ql @@ -5,7 +5,7 @@ * may lead to unpredictable behavior. * @kind problem * @problem.severity warning - * @precision high + * @precision medium * @id cpp/implicit-function-declaration * @tags correctness * maintainability @@ -38,7 +38,6 @@ predicate isCompiledAsC(File f) { from FunctionDeclarationEntry fdeIm, FunctionCall fc where - not any(Compilation c).buildModeNone() and isCompiledAsC(fdeIm.getFile()) and not isFromMacroDefinition(fc) and fdeIm.isImplicit() and diff --git a/cpp/ql/src/Metrics/Internal/CallableExtents.ql b/cpp/ql/src/Metrics/Internal/CallableExtents.ql index 7a376c6da721..7ebae0385dab 100644 --- a/cpp/ql/src/Metrics/Internal/CallableExtents.ql +++ b/cpp/ql/src/Metrics/Internal/CallableExtents.ql @@ -20,12 +20,14 @@ class RangeFunction extends Function { * For more information, see * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ - predicate hasLocationInfo(string path, int sl, int sc, int el, int ec) { - super.getLocation().hasLocationInfo(path, sl, sc, _, _) and + predicate hasLocationInfo( + string filepath, int startline, int startcolumn, int endline, int endcolumn + ) { + super.getLocation().hasLocationInfo(filepath, startline, startcolumn, _, _) and ( - this.getBlock().getLocation().hasLocationInfo(path, _, _, el, ec) + this.getBlock().getLocation().hasLocationInfo(filepath, _, _, endline, endcolumn) or - not exists(this.getBlock()) and el = sl + 1 and ec = 1 + not exists(this.getBlock()) and endline = startline + 1 and endcolumn = 1 ) } } diff --git a/cpp/ql/src/Security/CWE/CWE-120/UnboundedWrite.ql b/cpp/ql/src/Security/CWE/CWE-120/UnboundedWrite.ql index 2cce72bc2ae8..ff9bc59b716b 100644 --- a/cpp/ql/src/Security/CWE/CWE-120/UnboundedWrite.ql +++ b/cpp/ql/src/Security/CWE/CWE-120/UnboundedWrite.ql @@ -109,7 +109,7 @@ predicate lessThanOrEqual(IRGuardCondition g, Expr e, boolean branch) { g.comparesEq(left, _, _, true, branch) | interestingLessThanOrEqual(left) and - left.getDef().getUnconvertedResultExpression() = e + left.getDef().getConvertedResultExpression() = e ) } diff --git a/cpp/ql/src/Security/CWE/CWE-190/ComparisonWithWiderType.ql b/cpp/ql/src/Security/CWE/CWE-190/ComparisonWithWiderType.ql index 021be5d091b3..3f330807304f 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/ComparisonWithWiderType.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/ComparisonWithWiderType.ql @@ -6,7 +6,7 @@ * @kind problem * @problem.severity warning * @security-severity 7.8 - * @precision high + * @precision medium * @tags reliability * security * external/cwe/cwe-190 @@ -51,7 +51,6 @@ int getComparisonSizeAdjustment(Expr e) { from Loop l, RelationalOperation rel, VariableAccess small, Expr large where - not any(Compilation c).buildModeNone() and small = rel.getLesserOperand() and large = rel.getGreaterOperand() and rel = l.getCondition().getAChild*() and diff --git a/cpp/ql/src/Security/CWE/CWE-190/IntegerOverflowTainted.ql b/cpp/ql/src/Security/CWE/CWE-190/IntegerOverflowTainted.ql index 6ff06d355b9b..3978d2ded95d 100644 --- a/cpp/ql/src/Security/CWE/CWE-190/IntegerOverflowTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-190/IntegerOverflowTainted.ql @@ -25,10 +25,10 @@ import semmle.code.cpp.controlflow.IRGuards as IRGuards predicate outOfBoundsExpr(Expr expr, string kind) { if convertedExprMightOverflowPositively(expr) then kind = "overflow" - else - if convertedExprMightOverflowNegatively(expr) - then kind = "overflow negatively" - else none() + else ( + convertedExprMightOverflowNegatively(expr) and + kind = "overflow negatively" + ) } predicate isSource(FS::FlowSource source, string sourceType) { sourceType = source.getSourceType() } diff --git a/cpp/ql/src/Security/CWE/CWE-295/SSLResultNotChecked.ql b/cpp/ql/src/Security/CWE/CWE-295/SSLResultNotChecked.ql index de8520de1b3b..779457508b72 100644 --- a/cpp/ql/src/Security/CWE/CWE-295/SSLResultNotChecked.ql +++ b/cpp/ql/src/Security/CWE/CWE-295/SSLResultNotChecked.ql @@ -55,30 +55,9 @@ predicate resultIsChecked(SslGetPeerCertificateCall getCertCall, ControlFlowNode predicate certIsZero( SslGetPeerCertificateCall getCertCall, ControlFlowNode node1, ControlFlowNode node2 ) { - exists(Expr cert | cert = globalValueNumber(getCertCall).getAnExpr() | - exists(GuardCondition guard, Expr zero | - zero.getValue().toInt() = 0 and - node1 = guard and - ( - // if (cert == zero) { - guard.comparesEq(cert, zero, 0, true, true) and - node2 = guard.getATrueSuccessor() - or - // if (cert != zero) { } - guard.comparesEq(cert, zero, 0, false, true) and - node2 = guard.getAFalseSuccessor() - ) - ) - or - ( - // if (cert) { } - node1 = cert - or - // if (!cert) { - node1.(NotExpr).getAChild() = cert - ) and - node2 = node1.getASuccessor() and - not cert.(GuardCondition).controls(node2, true) // cert may be false + exists(Expr cert | + cert = globalValueNumber(getCertCall).getAnExpr() and + node1.(GuardCondition).ensuresEqEdge(cert, 0, _, node2.getBasicBlock(), true) ) } diff --git a/cpp/ql/src/Security/CWE/CWE-457/UninitializedVariables.qll b/cpp/ql/src/Security/CWE/CWE-457/UninitializedVariables.qll index 14eec81ff58f..804d6a48754c 100644 --- a/cpp/ql/src/Security/CWE/CWE-457/UninitializedVariables.qll +++ b/cpp/ql/src/Security/CWE/CWE-457/UninitializedVariables.qll @@ -31,27 +31,28 @@ private predicate hasConditionalInitialization( class ConditionallyInitializedVariable extends LocalVariable { ConditionalInitializationCall call; ConditionalInitializationFunction f; - VariableAccess initAccess; Evidence e; ConditionallyInitializedVariable() { // Find a call that conditionally initializes this variable - hasConditionalInitialization(f, call, this, initAccess, e) and - // Ignore cases where the variable is assigned prior to the call - not reaches(this.getAnAssignedValue(), initAccess) and - // Ignore cases where the variable is assigned field-wise prior to the call. - not exists(FieldAccess fa | - exists(Assignment a | - fa = getAFieldAccess(this) and - a.getLValue() = fa + exists(VariableAccess initAccess | + hasConditionalInitialization(f, call, this, initAccess, e) and + // Ignore cases where the variable is assigned prior to the call + not reaches(this.getAnAssignedValue(), initAccess) and + // Ignore cases where the variable is assigned field-wise prior to the call. + not exists(FieldAccess fa | + exists(Assignment a | + fa = getAFieldAccess(this) and + a.getLValue() = fa + ) + | + reaches(fa, initAccess) + ) and + // Ignore cases where the variable is assigned by a prior call to an initialization function + not exists(Call c | + this.getAnAccess() = getAnInitializedArgument(c).(AddressOfExpr).getOperand() and + reaches(c, initAccess) ) - | - reaches(fa, initAccess) - ) and - // Ignore cases where the variable is assigned by a prior call to an initialization function - not exists(Call c | - this.getAnAccess() = getAnInitializedArgument(c).(AddressOfExpr).getOperand() and - reaches(c, initAccess) ) and /* * Static local variables with constant initializers do not have the initializer expr as part of diff --git a/cpp/ql/src/Security/CWE/CWE-468/SuspiciousAddWithSizeof.ql b/cpp/ql/src/Security/CWE/CWE-468/SuspiciousAddWithSizeof.ql index da92c792432c..d9c9df4fd918 100644 --- a/cpp/ql/src/Security/CWE/CWE-468/SuspiciousAddWithSizeof.ql +++ b/cpp/ql/src/Security/CWE/CWE-468/SuspiciousAddWithSizeof.ql @@ -6,7 +6,7 @@ * @kind problem * @problem.severity warning * @security-severity 8.8 - * @precision high + * @precision medium * @id cpp/suspicious-add-sizeof * @tags security * external/cwe/cwe-468 @@ -24,7 +24,6 @@ private predicate isCharSzPtrExpr(Expr e) { from Expr sizeofExpr, Expr e where - not any(Compilation c).buildModeNone() and // If we see an addWithSizeof then we expect the type of // the pointer expression to be `char*` or `void*`. Otherwise it // is probably a mistake. diff --git a/cpp/ql/src/Security/CWE/CWE-570/IncorrectAllocationErrorHandling.ql b/cpp/ql/src/Security/CWE/CWE-570/IncorrectAllocationErrorHandling.ql index d4d908f8474b..c03ae995090c 100644 --- a/cpp/ql/src/Security/CWE/CWE-570/IncorrectAllocationErrorHandling.ql +++ b/cpp/ql/src/Security/CWE/CWE-570/IncorrectAllocationErrorHandling.ql @@ -41,7 +41,7 @@ predicate deleteMayThrow(DeleteOrDeleteArrayExpr deleteExpr) { } /** - * Holds if the function may throw an exception when called. That is, if the body of the function looks + * Holds if the function `f` may throw an exception when called. That is, if the body of the function looks * like it might throw an exception, and the function does not have a `noexcept` or `throw()` specifier. */ predicate functionMayThrow(Function f) { diff --git a/cpp/ql/src/change-notes/released/1.5.0.md b/cpp/ql/src/change-notes/released/1.5.0.md new file mode 100644 index 000000000000..383825331fff --- /dev/null +++ b/cpp/ql/src/change-notes/released/1.5.0.md @@ -0,0 +1,11 @@ +## 1.5.0 + +### Major Analysis Improvements + +* The queries `cpp/wrong-type-format-argument`, `cpp/comparison-with-wider-type`, `cpp/integer-multiplication-cast-to-long`, `cpp/implicit-function-declaration` and `cpp/suspicious-add-sizeof` have had their precisions reduced from `high` to `medium`. They will also now give alerts for projects built with `build-mode: none`. +* The queries `cpp/wrong-type-format-argument`, `cpp/comparison-with-wider-type`, `cpp/integer-multiplication-cast-to-long` and `cpp/suspicious-add-sizeof` are no longer included in the `code-scanning` suite. + +### Bug Fixes + +* The predicate `occurenceCount` in the file module `MagicConstants` has been deprecated. Use `occurrenceCount` instead. +* The predicate `additionalAdditionOrSubstractionCheckForLeapYear` in the file module `LeapYear` has been deprecated. Use `additionalAdditionOrSubtractionCheckForLeapYear` instead. diff --git a/cpp/ql/src/codeql-pack.release.yml b/cpp/ql/src/codeql-pack.release.yml index 163362bd6321..639f80c43417 100644 --- a/cpp/ql/src/codeql-pack.release.yml +++ b/cpp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.7 +lastReleaseVersion: 1.5.0 diff --git a/cpp/ql/src/definitions.ql b/cpp/ql/src/definitions.ql index c12277eaf23a..339b481f5f77 100644 --- a/cpp/ql/src/definitions.ql +++ b/cpp/ql/src/definitions.ql @@ -13,6 +13,6 @@ where def = definitionOf(e, kind) and // We need to exclude definitions for elements inside template instantiations, // as these often lead to multiple links to definitions from the same source location. - // LGTM does not support this behaviour. + // LGTM does not support this behavior. not e.isFromTemplateInstantiation(_) select e, def, kind diff --git a/cpp/ql/src/experimental/Likely Bugs/RedundantNullCheckParam.ql b/cpp/ql/src/experimental/Likely Bugs/RedundantNullCheckParam.ql index 36e42cae92a4..ce3497bb9655 100644 --- a/cpp/ql/src/experimental/Likely Bugs/RedundantNullCheckParam.ql +++ b/cpp/ql/src/experimental/Likely Bugs/RedundantNullCheckParam.ql @@ -47,7 +47,7 @@ where // for a function parameter unchecked.getTarget() = param and // this function parameter is not overwritten - count(param.getAnAssignment()) = 0 and + not exists(param.getAnAssignment()) and check.getTarget() = param and // which is once checked candidateResultChecked(check, eqop) and diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-1126/DeclarationOfVariableWithUnnecessarilyWideScope.ql b/cpp/ql/src/experimental/Security/CWE/CWE-1126/DeclarationOfVariableWithUnnecessarilyWideScope.ql index 136931f00ec6..bbb219a22da7 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-1126/DeclarationOfVariableWithUnnecessarilyWideScope.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-1126/DeclarationOfVariableWithUnnecessarilyWideScope.ql @@ -19,16 +19,17 @@ import cpp * Errors when using a variable declaration inside a loop. */ class DangerousWhileLoop extends WhileStmt { - Expr exp; Declaration dl; DangerousWhileLoop() { this = dl.getParentScope().(BlockStmt).getParent*() and - exp = this.getCondition().getAChild*() and - not exp instanceof PointerFieldAccess and - not exp instanceof ValueFieldAccess and - exp.(VariableAccess).getTarget().getName() = dl.getName() and - not exp.getParent*() instanceof FunctionCall + exists(Expr exp | + exp = this.getCondition().getAChild*() and + not exp instanceof PointerFieldAccess and + not exp instanceof ValueFieldAccess and + exp.(VariableAccess).getTarget().getName() = dl.getName() and + not exp.getParent*() instanceof FunctionCall + ) } Declaration getDeclaration() { result = dl } diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql b/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql index 6529bf6cdf89..74ac8e6da661 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-125/DangerousWorksWithMultibyteOrWideCharacters.ql @@ -46,7 +46,7 @@ predicate exprMayBeString(Expr exp) { ) } -/** Holds if expression is constant or operator call `sizeof`. */ +/** Holds if expression `exp` is constant or operator call `sizeof`. */ predicate argConstOrSizeof(Expr exp) { exp.getValue().toInt() > 1 or exp.(SizeofTypeOperator).getTypeOperand().getSize() > 1 diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-243/IncorrectChangingWorkingDirectory.ql b/cpp/ql/src/experimental/Security/CWE/CWE-243/IncorrectChangingWorkingDirectory.ql index ce5f4dd00f87..9d61418fd776 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-243/IncorrectChangingWorkingDirectory.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-243/IncorrectChangingWorkingDirectory.ql @@ -15,7 +15,7 @@ import cpp import semmle.code.cpp.commons.Exclusions -/** Holds if a `fc` function call is available before or after a `chdir` function call. */ +/** Holds if a `fcp` function call is available before or after a `chdir` function call. */ predicate inExistsChdir(FunctionCall fcp) { exists(FunctionCall fctmp | ( @@ -29,7 +29,7 @@ predicate inExistsChdir(FunctionCall fcp) { ) } -/** Holds if a `fc` function call is available before or after a function call containing a `chdir` call. */ +/** Holds if a `fcp` function call is available before or after a function call containing a `chdir` call. */ predicate outExistsChdir(FunctionCall fcp) { exists(FunctionCall fctmp | exists(FunctionCall fctmp2 | diff --git a/cpp/ql/src/experimental/Security/CWE/CWE-416/UseAfterExpiredLifetime.ql b/cpp/ql/src/experimental/Security/CWE/CWE-416/UseAfterExpiredLifetime.ql index ffcac802b6dc..fec373ce5216 100644 --- a/cpp/ql/src/experimental/Security/CWE/CWE-416/UseAfterExpiredLifetime.ql +++ b/cpp/ql/src/experimental/Security/CWE/CWE-416/UseAfterExpiredLifetime.ql @@ -266,7 +266,7 @@ class LifetimePointerType extends LifetimeIndirectionType { class FullExpr extends Expr { FullExpr() { // A full-expression is not a subexpression - not exists(Expr p | this.getParent() = p) + not this.getParent() instanceof Expr or // A sub-expression that is an unevaluated operand this.isUnevaluated() diff --git a/cpp/ql/src/external/DefectFilter.qll b/cpp/ql/src/external/DefectFilter.qll index ad786e9cbc96..a3719140741a 100644 --- a/cpp/ql/src/external/DefectFilter.qll +++ b/cpp/ql/src/external/DefectFilter.qll @@ -5,8 +5,8 @@ import cpp /** * Holds if `id` in the opaque identifier of a result reported by query `queryPath`, * such that `message` is the associated message and the location of the result spans - * column `startcolumn` of line `startline` to column `endcolumn` of line `endline` - * in file `filepath`. + * column `startcol` of line `startline` to column `endcol` of line `endline` + * in file `file`. * * For more information, see [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ diff --git a/cpp/ql/src/external/MetricFilter.qll b/cpp/ql/src/external/MetricFilter.qll index 0315cd23c8d0..39475451b7a8 100644 --- a/cpp/ql/src/external/MetricFilter.qll +++ b/cpp/ql/src/external/MetricFilter.qll @@ -5,8 +5,8 @@ import cpp /** * Holds if `id` in the opaque identifier of a result reported by query `queryPath`, * such that `value` is the reported metric value and the location of the result spans - * column `startcolumn` of line `startline` to column `endcolumn` of line `endline` - * in file `filepath`. + * column `startcol` of line `startline` to column `endcol` of line `endline` + * in file `file`. * * For more information, see [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). */ diff --git a/cpp/ql/src/jsf/4.10 Classes/AV Rule 96.ql b/cpp/ql/src/jsf/4.10 Classes/AV Rule 96.ql index 67e01ffc7c07..4697af80c17c 100644 --- a/cpp/ql/src/jsf/4.10 Classes/AV Rule 96.ql +++ b/cpp/ql/src/jsf/4.10 Classes/AV Rule 96.ql @@ -28,7 +28,7 @@ where exists(FunctionCall c, int i, Function f | c.getArgument(i) = e and c.getTarget() = f and - exists(Parameter p | f.getParameter(i) = p) and // varargs + exists(f.getParameter(i)) and // varargs baseElement(e.getType(), cl) and // only interested in arrays with classes not compatible(f.getParameter(i).getUnspecifiedType(), e.getUnspecifiedType()) ) diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index aaa6ceb2e931..5a74eac8d615 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.4.7 +version: 1.5.0 groups: - cpp - queries diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected index cb25f1a21e39..ff41f299f9c2 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/dataflow-consistency.expected @@ -50,37 +50,21 @@ argHasPostUpdate postWithInFlow | BarrierGuard.cpp:49:6:49:6 | x [post update] | PostUpdateNode should not be the target of local flow. | | BarrierGuard.cpp:60:7:60:7 | x [post update] | PostUpdateNode should not be the target of local flow. | -| clang.cpp:22:9:22:20 | sourceArray1 [inner post update] | PostUpdateNode should not be the target of local flow. | -| clang.cpp:23:18:23:29 | sourceArray1 [inner post update] | PostUpdateNode should not be the target of local flow. | | clang.cpp:29:22:29:23 | m1 [post update] | PostUpdateNode should not be the target of local flow. | -| clang.cpp:51:3:51:12 | stackArray [inner post update] | PostUpdateNode should not be the target of local flow. | | clang.cpp:51:3:51:15 | access to array [post update] | PostUpdateNode should not be the target of local flow. | | dispatch.cpp:60:3:60:14 | globalBottom [post update] | PostUpdateNode should not be the target of local flow. | | dispatch.cpp:61:3:61:14 | globalMiddle [post update] | PostUpdateNode should not be the target of local flow. | -| dispatch.cpp:78:24:78:37 | call to allocateBottom [inner post update] | PostUpdateNode should not be the target of local flow. | | dispatch.cpp:148:5:148:5 | f [post update] | PostUpdateNode should not be the target of local flow. | | dispatch.cpp:168:8:168:8 | f [post update] | PostUpdateNode should not be the target of local flow. | | example.c:24:9:24:9 | x [post update] | PostUpdateNode should not be the target of local flow. | | example.c:24:20:24:20 | y [post update] | PostUpdateNode should not be the target of local flow. | | example.c:26:9:26:9 | x [post update] | PostUpdateNode should not be the target of local flow. | -| example.c:26:19:26:24 | coords [inner post update] | PostUpdateNode should not be the target of local flow. | -| example.c:28:23:28:25 | pos [inner post update] | PostUpdateNode should not be the target of local flow. | | flowOut.cpp:5:5:5:12 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:5:6:5:12 | toTaint [inner post update] | PostUpdateNode should not be the target of local flow. | | flowOut.cpp:8:5:8:12 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:8:6:8:12 | toTaint [inner post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:18:17:18:17 | x [inner post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:30:12:30:12 | x [inner post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:37:5:37:6 | p2 [inner post update] | PostUpdateNode should not be the target of local flow. | | flowOut.cpp:37:5:37:9 | access to array [post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:84:3:84:7 | call to deref [inner post update] | PostUpdateNode should not be the target of local flow. | | flowOut.cpp:84:3:84:14 | access to array [post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:84:10:84:10 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | flowOut.cpp:90:3:90:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:90:4:90:4 | q [inner post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:101:14:101:14 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | flowOut.cpp:168:3:168:10 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| flowOut.cpp:168:4:168:10 | toTaint [inner post update] | PostUpdateNode should not be the target of local flow. | | globals.cpp:13:5:13:19 | flowTestGlobal1 [post update] | PostUpdateNode should not be the target of local flow. | | globals.cpp:23:5:23:19 | flowTestGlobal2 [post update] | PostUpdateNode should not be the target of local flow. | | lambdas.cpp:23:3:23:14 | v [post update] | PostUpdateNode should not be the target of local flow. | @@ -106,57 +90,30 @@ postWithInFlow | ref.cpp:109:9:109:11 | val [post update] | PostUpdateNode should not be the target of local flow. | | ref.cpp:113:11:113:13 | val [post update] | PostUpdateNode should not be the target of local flow. | | ref.cpp:115:11:115:13 | val [post update] | PostUpdateNode should not be the target of local flow. | -| self_parameter_flow.cpp:3:4:3:5 | ps [inner post update] | PostUpdateNode should not be the target of local flow. | -| self_parameter_flow.cpp:8:9:8:9 | s [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:91:3:91:9 | source1 [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:115:3:115:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:115:4:115:6 | out [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:120:3:120:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:120:4:120:6 | out [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:125:3:125:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:125:4:125:6 | out [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:333:5:333:13 | globalVar [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:347:5:347:13 | globalVar [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:359:5:359:9 | field [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:373:5:373:9 | field [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:384:10:384:13 | ref arg & ... | PostUpdateNode should not be the target of local flow. | -| test.cpp:384:11:384:13 | tmp [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:391:10:391:13 | ref arg & ... | PostUpdateNode should not be the target of local flow. | -| test.cpp:391:11:391:13 | tmp [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:400:10:400:13 | ref arg & ... | PostUpdateNode should not be the target of local flow. | -| test.cpp:400:11:400:13 | tmp [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:407:10:407:13 | ref arg & ... | PostUpdateNode should not be the target of local flow. | -| test.cpp:407:11:407:13 | tmp [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:423:21:423:25 | local [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:441:19:441:23 | local [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:472:3:472:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:472:4:472:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:477:22:477:22 | x [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:506:3:506:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:506:4:506:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:512:35:512:35 | x [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:519:3:519:12 | stackArray [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:519:3:519:15 | access to array [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:520:3:520:12 | stackArray [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:520:3:520:15 | access to array [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:526:3:526:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:526:4:526:4 | e [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:531:40:531:40 | e [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:537:5:537:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:537:6:537:6 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:542:5:542:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:542:6:542:6 | p [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:548:25:548:25 | x [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:552:25:552:25 | y [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:562:5:562:13 | globalInt [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:576:5:576:13 | globalInt [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:589:19:589:19 | x [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:596:3:596:4 | xs [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:596:3:596:7 | access to array [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:602:3:602:3 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:602:3:602:7 | access to array [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:608:3:608:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:608:4:608:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:639:3:639:3 | x [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:646:3:646:3 | x [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:652:3:652:3 | x [post update] | PostUpdateNode should not be the target of local flow. | @@ -167,40 +124,23 @@ postWithInFlow | test.cpp:681:3:681:3 | s [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:689:3:689:3 | s [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:690:3:690:3 | s [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:694:4:694:6 | buf [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:704:23:704:25 | buf [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:715:25:715:25 | c [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:728:3:728:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:728:4:728:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:734:41:734:41 | x [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:808:5:808:21 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:808:6:808:21 | global_indirect1 [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:832:5:832:17 | global_direct [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:931:5:931:18 | global_pointer [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:932:5:932:19 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:932:6:932:19 | global_pointer [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1045:9:1045:11 | ref arg buf | PostUpdateNode should not be the target of local flow. | | test.cpp:1066:5:1066:5 | i [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1069:5:1069:5 | i [post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1087:5:1087:11 | content [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1088:9:1088:9 | a [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1092:5:1092:7 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1092:6:1092:7 | pp [inner post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1098:53:1098:53 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1108:3:1108:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1108:4:1108:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1109:3:1109:4 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1109:4:1109:4 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1138:3:1138:13 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1138:5:1138:8 | data [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1139:3:1139:7 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1139:4:1139:7 | data [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1153:5:1153:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1153:6:1153:6 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1165:5:1165:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1165:6:1165:6 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | test.cpp:1195:5:1195:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| test.cpp:1195:6:1195:6 | p [inner post update] | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition diff --git a/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected b/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected index 88dd9751f27e..4021dbc492a9 100644 --- a/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/fields/dataflow-consistency.expected @@ -48,8 +48,6 @@ argHasPostUpdate postWithInFlow | A.cpp:25:13:25:13 | c [post update] | PostUpdateNode should not be the target of local flow. | | A.cpp:27:28:27:28 | c [post update] | PostUpdateNode should not be the target of local flow. | -| A.cpp:42:11:42:12 | cc [inner post update] | PostUpdateNode should not be the target of local flow. | -| A.cpp:43:11:43:12 | ct [inner post update] | PostUpdateNode should not be the target of local flow. | | A.cpp:100:9:100:9 | a [post update] | PostUpdateNode should not be the target of local flow. | | A.cpp:142:10:142:10 | c [post update] | PostUpdateNode should not be the target of local flow. | | A.cpp:143:13:143:13 | b [post update] | PostUpdateNode should not be the target of local flow. | @@ -67,11 +65,9 @@ postWithInFlow | D.cpp:44:19:44:22 | elem [post update] | PostUpdateNode should not be the target of local flow. | | D.cpp:57:5:57:12 | boxfield [post update] | PostUpdateNode should not be the target of local flow. | | D.cpp:58:20:58:23 | elem [post update] | PostUpdateNode should not be the target of local flow. | -| E.cpp:33:19:33:19 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:9:6:9:7 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:13:5:13:6 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:17:5:17:6 | m1 [post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:25:18:25:19 | s1 [inner post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:37:8:37:9 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:42:6:42:7 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:49:9:49:10 | m1 [post update] | PostUpdateNode should not be the target of local flow. | @@ -83,70 +79,31 @@ postWithInFlow | aliasing.cpp:92:7:92:8 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:98:5:98:6 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:106:3:106:5 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:106:4:106:5 | pa [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:111:18:111:19 | m1 [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:126:15:126:16 | xs [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:136:16:136:17 | xs [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:147:16:147:16 | s [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:147:21:147:22 | m1 [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:175:21:175:22 | m1 [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:181:21:181:22 | m1 [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:187:21:187:22 | m1 [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:194:21:194:22 | m1 [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:200:23:200:24 | m1 [inner post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:205:23:205:24 | m1 [inner post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:215:14:215:15 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:223:17:223:18 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:234:19:234:20 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:242:22:242:23 | m1 [post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:252:5:252:31 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:252:28:252:31 | data [inner post update] | PostUpdateNode should not be the target of local flow. | | aliasing.cpp:262:5:262:29 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| aliasing.cpp:262:26:262:29 | data [inner post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:6:3:6:5 | arr [inner post update] | PostUpdateNode should not be the target of local flow. | | arrays.cpp:6:3:6:8 | access to array [post update] | PostUpdateNode should not be the target of local flow. | | arrays.cpp:15:3:15:10 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:15:5:15:7 | arr [inner post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:36:12:36:14 | arr [inner post update] | PostUpdateNode should not be the target of local flow. | | arrays.cpp:36:19:36:22 | data [post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:37:17:37:19 | arr [inner post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:38:17:38:19 | arr [inner post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:42:15:42:17 | arr [inner post update] | PostUpdateNode should not be the target of local flow. | | arrays.cpp:42:22:42:25 | data [post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:43:20:43:22 | arr [inner post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:44:20:44:22 | arr [inner post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:48:15:48:17 | ptr [inner post update] | PostUpdateNode should not be the target of local flow. | | arrays.cpp:48:22:48:25 | data [post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:49:20:49:22 | ptr [inner post update] | PostUpdateNode should not be the target of local flow. | -| arrays.cpp:50:20:50:22 | ptr [inner post update] | PostUpdateNode should not be the target of local flow. | | by_reference.cpp:12:8:12:8 | a [post update] | PostUpdateNode should not be the target of local flow. | | by_reference.cpp:16:11:16:11 | a [post update] | PostUpdateNode should not be the target of local flow. | -| by_reference.cpp:68:18:68:18 | s [inner post update] | PostUpdateNode should not be the target of local flow. | | by_reference.cpp:84:10:84:10 | a [post update] | PostUpdateNode should not be the target of local flow. | | by_reference.cpp:88:9:88:9 | a [post update] | PostUpdateNode should not be the target of local flow. | | by_reference.cpp:92:3:92:5 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| by_reference.cpp:92:4:92:5 | pa [inner post update] | PostUpdateNode should not be the target of local flow. | | by_reference.cpp:96:3:96:4 | pa [post update] | PostUpdateNode should not be the target of local flow. | -| by_reference.cpp:102:28:102:39 | inner_nested [inner post update] | PostUpdateNode should not be the target of local flow. | -| by_reference.cpp:104:22:104:22 | a [inner post update] | PostUpdateNode should not be the target of local flow. | -| by_reference.cpp:106:30:106:41 | inner_nested [inner post update] | PostUpdateNode should not be the target of local flow. | -| by_reference.cpp:108:24:108:24 | a [inner post update] | PostUpdateNode should not be the target of local flow. | -| by_reference.cpp:123:28:123:36 | inner_ptr [inner post update] | PostUpdateNode should not be the target of local flow. | -| by_reference.cpp:127:30:127:38 | inner_ptr [inner post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:19:3:19:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| clearning.cpp:19:6:19:6 | x [inner post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:32:3:32:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| clearning.cpp:32:6:32:6 | x [inner post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:39:3:39:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| clearning.cpp:39:6:39:6 | x [inner post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:40:5:40:5 | x [post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:47:5:47:5 | x [post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:53:3:53:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| clearning.cpp:53:6:53:6 | x [inner post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:75:2:75:10 | access to array [post update] | PostUpdateNode should not be the target of local flow. | -| clearning.cpp:75:4:75:6 | val [inner post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:82:2:82:9 | access to array [post update] | PostUpdateNode should not be the target of local flow. | -| clearning.cpp:82:4:82:6 | val [inner post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:83:7:83:9 | val [post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:97:4:97:6 | val [post update] | PostUpdateNode should not be the target of local flow. | | clearning.cpp:124:4:124:6 | val [post update] | PostUpdateNode should not be the target of local flow. | @@ -162,7 +119,6 @@ postWithInFlow | complex.cpp:11:22:11:23 | a_ [post update] | PostUpdateNode should not be the target of local flow. | | complex.cpp:12:22:12:23 | b_ [post update] | PostUpdateNode should not be the target of local flow. | | conflated.cpp:10:3:10:7 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| conflated.cpp:10:7:10:7 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | conflated.cpp:29:7:29:7 | x [post update] | PostUpdateNode should not be the target of local flow. | | conflated.cpp:36:7:36:7 | x [post update] | PostUpdateNode should not be the target of local flow. | | conflated.cpp:53:7:53:10 | next [post update] | PostUpdateNode should not be the target of local flow. | @@ -174,19 +130,11 @@ postWithInFlow | qualifiers.cpp:12:56:12:56 | a [post update] | PostUpdateNode should not be the target of local flow. | | qualifiers.cpp:13:57:13:57 | a [post update] | PostUpdateNode should not be the target of local flow. | | qualifiers.cpp:22:23:22:23 | a [post update] | PostUpdateNode should not be the target of local flow. | -| qualifiers.cpp:37:26:37:33 | call to getInner [inner post update] | PostUpdateNode should not be the target of local flow. | -| qualifiers.cpp:42:13:42:20 | call to getInner [inner post update] | PostUpdateNode should not be the target of local flow. | | qualifiers.cpp:42:25:42:25 | a [post update] | PostUpdateNode should not be the target of local flow. | -| qualifiers.cpp:47:7:47:11 | outer [inner post update] | PostUpdateNode should not be the target of local flow. | | qualifiers.cpp:47:27:47:27 | a [post update] | PostUpdateNode should not be the target of local flow. | -| realistic.cpp:49:13:49:15 | bar [inner post update] | PostUpdateNode should not be the target of local flow. | | realistic.cpp:49:20:49:22 | baz [post update] | PostUpdateNode should not be the target of local flow. | -| realistic.cpp:53:13:53:15 | bar [inner post update] | PostUpdateNode should not be the target of local flow. | | realistic.cpp:53:35:53:43 | bufferLen [post update] | PostUpdateNode should not be the target of local flow. | -| realistic.cpp:54:20:54:22 | bar [inner post update] | PostUpdateNode should not be the target of local flow. | | realistic.cpp:60:16:60:18 | ref arg dst | PostUpdateNode should not be the target of local flow. | -| realistic.cpp:61:25:61:27 | bar [inner post update] | PostUpdateNode should not be the target of local flow. | -| realistic.cpp:65:25:65:27 | bar [inner post update] | PostUpdateNode should not be the target of local flow. | | simple.cpp:20:24:20:25 | a_ [post update] | PostUpdateNode should not be the target of local flow. | | simple.cpp:21:24:21:25 | b_ [post update] | PostUpdateNode should not be the target of local flow. | | simple.cpp:65:7:65:7 | i [post update] | PostUpdateNode should not be the target of local flow. | @@ -194,9 +142,6 @@ postWithInFlow | simple.cpp:92:7:92:7 | i [post update] | PostUpdateNode should not be the target of local flow. | | simple.cpp:118:7:118:7 | i [post update] | PostUpdateNode should not be the target of local flow. | | simple.cpp:124:5:124:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| simple.cpp:124:6:124:6 | p [inner post update] | PostUpdateNode should not be the target of local flow. | -| struct_init.c:24:11:24:12 | ab [inner post update] | PostUpdateNode should not be the target of local flow. | -| struct_init.c:36:17:36:24 | nestedAB [inner post update] | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.expected index 49b1f021f076..c89f4455bc59 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/consistency.expected @@ -18,7 +18,6 @@ postIsInSameCallable reverseRead argHasPostUpdate postWithInFlow -| tests.cpp:436:6:436:25 | [summary] to write: Argument[1] in madCallArg0WithValue | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index c3085da03ab5..630a4ca5ceba 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -24581,6 +24581,516 @@ ir.cpp: # 2776| Value = [CStyleCast] 42 # 2776| ValueCategory = prvalue # 2777| getStmt(2): [ReturnStmt] return ... +# 2779| [TopLevelFunction] void vla_sizeof_test(int, size_t, char) +# 2779| : +# 2779| getParameter(0): [Parameter] len1 +# 2779| Type = [IntType] int +# 2779| getParameter(1): [Parameter] len2 +# 2779| Type = [CTypedefType,Size_t] size_t +# 2779| getParameter(2): [Parameter] len3 +# 2779| Type = [PlainCharType] char +# 2779| getEntryPoint(): [BlockStmt] { ... } +# 2780| getStmt(0): [DeclStmt] declaration +# 2780| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1 +# 2780| Type = [ArrayType] char[] +# 2780| getStmt(1): [VlaDimensionStmt] VLA dimension size +# 2780| getDimensionExpr(): [VariableAccess] len1 +# 2780| Type = [IntType] int +# 2780| ValueCategory = prvalue(load) +# 2780| getStmt(2): [VlaDeclStmt] VLA declaration +# 2781| getStmt(3): [DeclStmt] declaration +# 2781| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2781| Type = [CTypedefType,Size_t] size_t +# 2781| getVariable().getInitializer(): [Initializer] initializer for x +# 2781| getExpr(): [SizeofExprOperator] sizeof() +# 2781| Type = [LongType] unsigned long +# 2781| ValueCategory = prvalue +# 2781| getExprOperand(): [VariableAccess] tmp1 +# 2781| Type = [ArrayType] char[] +# 2781| ValueCategory = lvalue +# 2781| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2781| Type = [ArrayType] char[] +# 2781| ValueCategory = lvalue +# 2782| getStmt(4): [DeclStmt] declaration +# 2782| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp2 +# 2782| Type = [ArrayType] int[][] +# 2782| getStmt(5): [VlaDimensionStmt] VLA dimension size +# 2782| getDimensionExpr(): [VariableAccess] len1 +# 2782| Type = [IntType] int +# 2782| ValueCategory = prvalue(load) +# 2782| getStmt(6): [VlaDimensionStmt] VLA dimension size +# 2782| getDimensionExpr(): [VariableAccess] len2 +# 2782| Type = [CTypedefType,Size_t] size_t +# 2782| ValueCategory = prvalue(load) +# 2782| getStmt(7): [VlaDeclStmt] VLA declaration +# 2783| getStmt(8): [DeclStmt] declaration +# 2783| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2783| Type = [CTypedefType,Size_t] size_t +# 2783| getVariable().getInitializer(): [Initializer] initializer for y +# 2783| getExpr(): [SizeofExprOperator] sizeof() +# 2783| Type = [LongType] unsigned long +# 2783| ValueCategory = prvalue +# 2783| getExprOperand(): [VariableAccess] tmp2 +# 2783| Type = [ArrayType] int[][] +# 2783| ValueCategory = lvalue +# 2783| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2783| Type = [ArrayType] int[][] +# 2783| ValueCategory = lvalue +# 2784| getStmt(9): [DeclStmt] declaration +# 2784| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z +# 2784| Type = [CTypedefType,Size_t] size_t +# 2784| getVariable().getInitializer(): [Initializer] initializer for z +# 2784| getExpr(): [SizeofExprOperator] sizeof() +# 2784| Type = [LongType] unsigned long +# 2784| ValueCategory = prvalue +# 2784| getExprOperand(): [PointerDereferenceExpr] * ... +# 2784| Type = [ArrayType] int[] +# 2784| ValueCategory = lvalue +# 2784| getOperand(): [VariableAccess] tmp2 +# 2784| Type = [ArrayType] int[][] +# 2784| ValueCategory = lvalue +# 2784| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2784| Type = [PointerType] int(*)[] +# 2784| ValueCategory = prvalue +# 2784| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2784| Type = [ArrayType] int[] +# 2784| ValueCategory = lvalue +# 2785| getStmt(10): [DeclStmt] declaration +# 2785| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp3 +# 2785| Type = [ArrayType] int[][][] +# 2785| getStmt(11): [VlaDimensionStmt] VLA dimension size +# 2785| getDimensionExpr(): [VariableAccess] len1 +# 2785| Type = [IntType] int +# 2785| ValueCategory = prvalue(load) +# 2785| getStmt(12): [VlaDimensionStmt] VLA dimension size +# 2785| getDimensionExpr(): [VariableAccess] len2 +# 2785| Type = [CTypedefType,Size_t] size_t +# 2785| ValueCategory = prvalue(load) +# 2785| getStmt(13): [VlaDimensionStmt] VLA dimension size +# 2785| getDimensionExpr(): [VariableAccess] len3 +# 2785| Type = [PlainCharType] char +# 2785| ValueCategory = prvalue(load) +# 2785| getStmt(14): [VlaDeclStmt] VLA declaration +# 2786| getStmt(15): [DeclStmt] declaration +# 2786| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 2786| Type = [CTypedefType,Size_t] size_t +# 2786| getVariable().getInitializer(): [Initializer] initializer for w +# 2786| getExpr(): [SizeofExprOperator] sizeof() +# 2786| Type = [LongType] unsigned long +# 2786| ValueCategory = prvalue +# 2786| getExprOperand(): [VariableAccess] tmp3 +# 2786| Type = [ArrayType] int[][][] +# 2786| ValueCategory = lvalue +# 2786| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2786| Type = [ArrayType] int[][][] +# 2786| ValueCategory = lvalue +# 2787| getStmt(16): [DeclStmt] declaration +# 2787| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 2787| Type = [CTypedefType,Size_t] size_t +# 2787| getVariable().getInitializer(): [Initializer] initializer for v +# 2787| getExpr(): [SizeofExprOperator] sizeof() +# 2787| Type = [LongType] unsigned long +# 2787| ValueCategory = prvalue +# 2787| getExprOperand(): [PointerDereferenceExpr] * ... +# 2787| Type = [ArrayType] int[][] +# 2787| ValueCategory = lvalue +# 2787| getOperand(): [VariableAccess] tmp3 +# 2787| Type = [ArrayType] int[][][] +# 2787| ValueCategory = lvalue +# 2787| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2787| Type = [PointerType] int(*)[][] +# 2787| ValueCategory = prvalue +# 2787| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2787| Type = [ArrayType] int[][] +# 2787| ValueCategory = lvalue +# 2788| getStmt(17): [DeclStmt] declaration +# 2788| getDeclarationEntry(0): [VariableDeclarationEntry] definition of u +# 2788| Type = [CTypedefType,Size_t] size_t +# 2788| getVariable().getInitializer(): [Initializer] initializer for u +# 2788| getExpr(): [SizeofExprOperator] sizeof() +# 2788| Type = [LongType] unsigned long +# 2788| ValueCategory = prvalue +# 2788| getExprOperand(): [PointerDereferenceExpr] * ... +# 2788| Type = [ArrayType] int[] +# 2788| ValueCategory = lvalue +# 2788| getOperand(): [PointerDereferenceExpr] * ... +# 2788| Type = [ArrayType] int[][] +# 2788| ValueCategory = lvalue +# 2788| getOperand(): [VariableAccess] tmp3 +# 2788| Type = [ArrayType] int[][][] +# 2788| ValueCategory = lvalue +# 2788| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2788| Type = [PointerType] int(*)[][] +# 2788| ValueCategory = prvalue +# 2788| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2788| Type = [PointerType] int(*)[] +# 2788| ValueCategory = prvalue +# 2788| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2788| Type = [ArrayType] int[] +# 2788| ValueCategory = lvalue +# 2789| getStmt(18): [DeclStmt] declaration +# 2789| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t +# 2789| Type = [CTypedefType,Size_t] size_t +# 2789| getVariable().getInitializer(): [Initializer] initializer for t +# 2789| getExpr(): [SizeofExprOperator] sizeof() +# 2789| Type = [LongType] unsigned long +# 2789| Value = [SizeofExprOperator] 4 +# 2789| ValueCategory = prvalue +# 2789| getExprOperand(): [PointerDereferenceExpr] * ... +# 2789| Type = [IntType] int +# 2789| ValueCategory = lvalue +# 2789| getOperand(): [PointerDereferenceExpr] * ... +# 2789| Type = [ArrayType] int[] +# 2789| ValueCategory = lvalue +# 2789| getOperand(): [PointerDereferenceExpr] * ... +# 2789| Type = [ArrayType] int[][] +# 2789| ValueCategory = lvalue +# 2789| getOperand(): [VariableAccess] tmp3 +# 2789| Type = [ArrayType] int[][][] +# 2789| ValueCategory = lvalue +# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2789| Type = [PointerType] int(*)[][] +# 2789| ValueCategory = prvalue +# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2789| Type = [PointerType] int(*)[] +# 2789| ValueCategory = prvalue +# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2789| Type = [IntPointerType] int * +# 2789| ValueCategory = prvalue +# 2789| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2789| Type = [IntType] int +# 2789| ValueCategory = lvalue +# 2790| getStmt(19): [ReturnStmt] return ... +# 2792| [TopLevelFunction] void vla_sizeof_test2(int, size_t, char) +# 2792| : +# 2792| getParameter(0): [Parameter] len1 +# 2792| Type = [IntType] int +# 2792| getParameter(1): [Parameter] len2 +# 2792| Type = [CTypedefType,Size_t] size_t +# 2792| getParameter(2): [Parameter] len3 +# 2792| Type = [PlainCharType] char +# 2792| getEntryPoint(): [BlockStmt] { ... } +# 2793| getStmt(0): [DeclStmt] declaration +# 2793| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1 +# 2793| Type = [ArrayType] int[][] +# 2793| getStmt(1): [VlaDimensionStmt] VLA dimension size +# 2793| getDimensionExpr(): [VariableAccess] len1 +# 2793| Type = [IntType] int +# 2793| ValueCategory = prvalue(load) +# 2793| getStmt(2): [VlaDimensionStmt] VLA dimension size +# 2793| getDimensionExpr(): [VariableAccess] len2 +# 2793| Type = [CTypedefType,Size_t] size_t +# 2793| ValueCategory = prvalue(load) +# 2793| getStmt(3): [VlaDeclStmt] VLA declaration +# 2794| getStmt(4): [DeclStmt] declaration +# 2794| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z +# 2794| Type = [CTypedefType,Size_t] size_t +# 2794| getVariable().getInitializer(): [Initializer] initializer for z +# 2794| getExpr(): [SizeofExprOperator] sizeof() +# 2794| Type = [LongType] unsigned long +# 2794| ValueCategory = prvalue +# 2794| getExprOperand(): [ArrayExpr] access to array +# 2794| Type = [ArrayType] int[] +# 2794| ValueCategory = lvalue +# 2794| getArrayBase(): [VariableAccess] tmp1 +# 2794| Type = [ArrayType] int[][] +# 2794| ValueCategory = lvalue +# 2794| getArrayOffset(): [Literal] 1 +# 2794| Type = [IntType] int +# 2794| Value = [Literal] 1 +# 2794| ValueCategory = prvalue +# 2794| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2794| Type = [PointerType] int(*)[] +# 2794| ValueCategory = prvalue +# 2794| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2794| Type = [ArrayType] int[] +# 2794| ValueCategory = lvalue +# 2795| getStmt(5): [DeclStmt] declaration +# 2795| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp2 +# 2795| Type = [ArrayType] int[][][] +# 2795| getStmt(6): [VlaDimensionStmt] VLA dimension size +# 2795| getDimensionExpr(): [VariableAccess] len1 +# 2795| Type = [IntType] int +# 2795| ValueCategory = prvalue(load) +# 2795| getStmt(7): [VlaDimensionStmt] VLA dimension size +# 2795| getDimensionExpr(): [VariableAccess] len2 +# 2795| Type = [CTypedefType,Size_t] size_t +# 2795| ValueCategory = prvalue(load) +# 2795| getStmt(8): [VlaDimensionStmt] VLA dimension size +# 2795| getDimensionExpr(): [VariableAccess] len3 +# 2795| Type = [PlainCharType] char +# 2795| ValueCategory = prvalue(load) +# 2795| getStmt(9): [VlaDeclStmt] VLA declaration +# 2796| getStmt(10): [DeclStmt] declaration +# 2796| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 2796| Type = [CTypedefType,Size_t] size_t +# 2796| getVariable().getInitializer(): [Initializer] initializer for v +# 2796| getExpr(): [SizeofExprOperator] sizeof() +# 2796| Type = [LongType] unsigned long +# 2796| ValueCategory = prvalue +# 2796| getExprOperand(): [ArrayExpr] access to array +# 2796| Type = [ArrayType] int[][] +# 2796| ValueCategory = lvalue +# 2796| getArrayBase(): [VariableAccess] tmp2 +# 2796| Type = [ArrayType] int[][][] +# 2796| ValueCategory = lvalue +# 2796| getArrayOffset(): [Literal] 1 +# 2796| Type = [IntType] int +# 2796| Value = [Literal] 1 +# 2796| ValueCategory = prvalue +# 2796| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2796| Type = [PointerType] int(*)[][] +# 2796| ValueCategory = prvalue +# 2796| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2796| Type = [ArrayType] int[][] +# 2796| ValueCategory = lvalue +# 2797| getStmt(11): [DeclStmt] declaration +# 2797| getDeclarationEntry(0): [VariableDeclarationEntry] definition of u +# 2797| Type = [CTypedefType,Size_t] size_t +# 2797| getVariable().getInitializer(): [Initializer] initializer for u +# 2797| getExpr(): [SizeofExprOperator] sizeof() +# 2797| Type = [LongType] unsigned long +# 2797| ValueCategory = prvalue +# 2797| getExprOperand(): [ArrayExpr] access to array +# 2797| Type = [ArrayType] int[] +# 2797| ValueCategory = lvalue +# 2797| getArrayBase(): [ArrayExpr] access to array +# 2797| Type = [ArrayType] int[][] +# 2797| ValueCategory = lvalue +# 2797| getArrayBase(): [VariableAccess] tmp2 +# 2797| Type = [ArrayType] int[][][] +# 2797| ValueCategory = lvalue +# 2797| getArrayOffset(): [Literal] 1 +# 2797| Type = [IntType] int +# 2797| Value = [Literal] 1 +# 2797| ValueCategory = prvalue +# 2797| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2797| Type = [PointerType] int(*)[][] +# 2797| ValueCategory = prvalue +# 2797| getArrayOffset(): [Literal] 2 +# 2797| Type = [IntType] int +# 2797| Value = [Literal] 2 +# 2797| ValueCategory = prvalue +# 2797| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2797| Type = [PointerType] int(*)[] +# 2797| ValueCategory = prvalue +# 2797| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2797| Type = [ArrayType] int[] +# 2797| ValueCategory = lvalue +# 2798| getStmt(12): [DeclStmt] declaration +# 2798| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t +# 2798| Type = [CTypedefType,Size_t] size_t +# 2798| getVariable().getInitializer(): [Initializer] initializer for t +# 2798| getExpr(): [SizeofExprOperator] sizeof() +# 2798| Type = [LongType] unsigned long +# 2798| Value = [SizeofExprOperator] 4 +# 2798| ValueCategory = prvalue +# 2798| getExprOperand(): [ArrayExpr] access to array +# 2798| Type = [IntType] int +# 2798| ValueCategory = lvalue +# 2798| getArrayBase(): [ArrayExpr] access to array +# 2798| Type = [ArrayType] int[] +# 2798| ValueCategory = lvalue +# 2798| getArrayBase(): [ArrayExpr] access to array +# 2798| Type = [ArrayType] int[][] +# 2798| ValueCategory = lvalue +# 2798| getArrayBase(): [VariableAccess] tmp2 +# 2798| Type = [ArrayType] int[][][] +# 2798| ValueCategory = lvalue +# 2798| getArrayOffset(): [Literal] 1 +# 2798| Type = [IntType] int +# 2798| Value = [Literal] 1 +# 2798| ValueCategory = prvalue +# 2798| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2798| Type = [PointerType] int(*)[][] +# 2798| ValueCategory = prvalue +# 2798| getArrayOffset(): [Literal] 2 +# 2798| Type = [IntType] int +# 2798| Value = [Literal] 2 +# 2798| ValueCategory = prvalue +# 2798| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2798| Type = [PointerType] int(*)[] +# 2798| ValueCategory = prvalue +# 2798| getArrayOffset(): [Literal] 3 +# 2798| Type = [IntType] int +# 2798| Value = [Literal] 3 +# 2798| ValueCategory = prvalue +# 2798| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2798| Type = [IntPointerType] int * +# 2798| ValueCategory = prvalue +# 2798| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2798| Type = [IntType] int +# 2798| ValueCategory = lvalue +# 2799| getStmt(13): [ReturnStmt] return ... +# 2801| [TopLevelFunction] size_t vla_sizeof_test3(int, size_t, char, bool) +# 2801| : +# 2801| getParameter(0): [Parameter] len1 +# 2801| Type = [IntType] int +# 2801| getParameter(1): [Parameter] len2 +# 2801| Type = [CTypedefType,Size_t] size_t +# 2801| getParameter(2): [Parameter] len3 +# 2801| Type = [PlainCharType] char +# 2801| getParameter(3): [Parameter] b +# 2801| Type = [BoolType] bool +# 2801| getEntryPoint(): [BlockStmt] { ... } +# 2802| getStmt(0): [DeclStmt] declaration +# 2802| getDeclarationEntry(0): [TypeDeclarationEntry] declaration of arr +# 2802| Type = [CTypedefType,LocalTypedefType] arr +# 2802| getStmt(1): [VlaDimensionStmt] VLA dimension size +# 2802| getDimensionExpr(): [VariableAccess] len1 +# 2802| Type = [IntType] int +# 2802| ValueCategory = prvalue(load) +# 2802| getStmt(2): [VlaDimensionStmt] VLA dimension size +# 2802| getDimensionExpr(): [VariableAccess] len2 +# 2802| Type = [CTypedefType,Size_t] size_t +# 2802| ValueCategory = prvalue(load) +# 2802| getStmt(3): [VlaDeclStmt] VLA declaration +# 2803| getStmt(4): [DeclStmt] declaration +# 2803| getDeclarationEntry(0): [TypeDeclarationEntry] declaration of arr2 +# 2803| Type = [CTypedefType,LocalTypedefType] arr2 +# 2803| getStmt(5): [VlaDeclStmt] VLA declaration +# 2804| getStmt(6): [DeclStmt] declaration +# 2804| getDeclarationEntry(0): [TypeDeclarationEntry] declaration of arr3 +# 2804| Type = [CTypedefType,LocalTypedefType] arr3 +# 2804| getStmt(7): [VlaDimensionStmt] VLA dimension size +# 2804| getDimensionExpr(): [VariableAccess] len3 +# 2804| Type = [PlainCharType] char +# 2804| ValueCategory = prvalue(load) +# 2804| getStmt(8): [VlaDeclStmt] VLA declaration +# 2806| getStmt(9): [IfStmt] if (...) ... +# 2806| getCondition(): [VariableAccess] b +# 2806| Type = [BoolType] bool +# 2806| ValueCategory = prvalue(load) +# 2806| getThen(): [BlockStmt] { ... } +# 2807| getStmt(0): [DeclStmt] declaration +# 2807| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp +# 2807| Type = [CTypedefType,LocalTypedefType] arr3 +# 2807| getStmt(1): [VlaDeclStmt] VLA declaration +# 2808| getStmt(2): [ReturnStmt] return ... +# 2808| getExpr(): [SizeofExprOperator] sizeof() +# 2808| Type = [LongType] unsigned long +# 2808| ValueCategory = prvalue +# 2808| getExprOperand(): [ArrayExpr] access to array +# 2808| Type = [CTypedefType,LocalTypedefType] arr2 +# 2808| ValueCategory = lvalue +# 2808| getArrayBase(): [VariableAccess] tmp +# 2808| Type = [CTypedefType,LocalTypedefType] arr3 +# 2808| ValueCategory = lvalue +# 2808| getArrayOffset(): [Literal] 1 +# 2808| Type = [IntType] int +# 2808| Value = [Literal] 1 +# 2808| ValueCategory = prvalue +# 2808| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2808| Type = [PointerType] arr2 * +# 2808| ValueCategory = prvalue +# 2808| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2808| Type = [CTypedefType,LocalTypedefType] arr2 +# 2808| ValueCategory = lvalue +# 2811| getStmt(10): [ReturnStmt] return ... +# 2811| getExpr(): [Literal] 0 +# 2811| Type = [IntType] int +# 2811| Value = [Literal] 0 +# 2811| ValueCategory = prvalue +# 2811| getExpr().getFullyConverted(): [CStyleCast] (size_t)... +# 2811| Conversion = [IntegralConversion] integral conversion +# 2811| Type = [CTypedefType,Size_t] size_t +# 2811| Value = [CStyleCast] 0 +# 2811| ValueCategory = prvalue +# 2814| [TopLevelFunction] void vla_sizeof_test4(int, size_t) +# 2814| : +# 2814| getParameter(0): [Parameter] len1 +# 2814| Type = [IntType] int +# 2814| getParameter(1): [Parameter] len2 +# 2814| Type = [CTypedefType,Size_t] size_t +# 2814| getEntryPoint(): [BlockStmt] { ... } +# 2815| getStmt(0): [DeclStmt] declaration +# 2815| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1 +# 2815| Type = [ArrayType] int[][] +# 2815| getStmt(1): [VlaDimensionStmt] VLA dimension size +# 2815| getDimensionExpr(): [VariableAccess] len1 +# 2815| Type = [IntType] int +# 2815| ValueCategory = prvalue(load) +# 2815| getStmt(2): [VlaDimensionStmt] VLA dimension size +# 2815| getDimensionExpr(): [VariableAccess] len2 +# 2815| Type = [CTypedefType,Size_t] size_t +# 2815| ValueCategory = prvalue(load) +# 2815| getStmt(3): [VlaDeclStmt] VLA declaration +# 2816| getStmt(4): [DeclStmt] declaration +# 2816| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z +# 2816| Type = [CTypedefType,Size_t] size_t +# 2816| getVariable().getInitializer(): [Initializer] initializer for z +# 2816| getExpr(): [SizeofExprOperator] sizeof() +# 2816| Type = [LongType] unsigned long +# 2816| ValueCategory = prvalue +# 2816| getExprOperand(): [ArrayExpr] access to array +# 2816| Type = [ArrayType] int[] +# 2816| ValueCategory = lvalue +# 2816| getArrayBase(): [VariableAccess] tmp1 +# 2816| Type = [ArrayType] int[][] +# 2816| ValueCategory = lvalue +# 2816| getArrayOffset(): [Literal] 1 +# 2816| Type = [IntType] int +# 2816| Value = [Literal] 1 +# 2816| ValueCategory = prvalue +# 2816| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2816| Type = [PointerType] int(*)[] +# 2816| ValueCategory = prvalue +# 2816| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2816| Type = [ArrayType] int[] +# 2816| ValueCategory = lvalue +# 2817| getStmt(5): [ReturnStmt] return ... +# 2819| [TopLevelFunction] void vla_sizeof_test5(int, size_t) +# 2819| : +# 2819| getParameter(0): [Parameter] len1 +# 2819| Type = [IntType] int +# 2819| getParameter(1): [Parameter] len2 +# 2819| Type = [CTypedefType,Size_t] size_t +# 2819| getEntryPoint(): [BlockStmt] { ... } +# 2820| getStmt(0): [DeclStmt] declaration +# 2820| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1 +# 2820| Type = [ArrayType] int[][] +# 2820| getStmt(1): [VlaDimensionStmt] VLA dimension size +# 2820| getDimensionExpr(): [VariableAccess] len1 +# 2820| Type = [IntType] int +# 2820| ValueCategory = prvalue(load) +# 2820| getStmt(2): [VlaDimensionStmt] VLA dimension size +# 2820| getDimensionExpr(): [VariableAccess] len2 +# 2820| Type = [CTypedefType,Size_t] size_t +# 2820| ValueCategory = prvalue(load) +# 2820| getStmt(3): [VlaDeclStmt] VLA declaration +# 2821| getStmt(4): [DeclStmt] declaration +# 2821| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z +# 2821| Type = [CTypedefType,Size_t] size_t +# 2821| getVariable().getInitializer(): [Initializer] initializer for z +# 2821| getExpr(): [SizeofExprOperator] sizeof() +# 2821| Type = [LongType] unsigned long +# 2821| ValueCategory = prvalue +# 2821| getExprOperand(): [ArrayExpr] access to array +# 2821| Type = [ArrayType] int[] +# 2821| ValueCategory = lvalue +# 2821| getArrayBase(): [PointerDereferenceExpr] * ... +# 2821| Type = [ArrayType] int[][] +# 2821| ValueCategory = lvalue +# 2821| getOperand(): [AddressOfExpr] & ... +# 2821| Type = [PointerType] int(*)[][] +# 2821| ValueCategory = prvalue +# 2821| getOperand(): [VariableAccess] tmp1 +# 2821| Type = [ArrayType] int[][] +# 2821| ValueCategory = lvalue +# 2821| getArrayOffset(): [Literal] 1 +# 2821| Type = [IntType] int +# 2821| Value = [Literal] 1 +# 2821| ValueCategory = prvalue +# 2821| getArrayBase().getFullyConverted(): [ParenthesisExpr] (...) +# 2821| Type = [PointerType] int(*)[] +# 2821| ValueCategory = prvalue +# 2821| getExpr(): [ArrayToPointerConversion] array to pointer conversion +# 2821| Type = [PointerType] int(*)[] +# 2821| ValueCategory = prvalue +# 2821| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2821| Type = [ArrayType] int[] +# 2821| ValueCategory = lvalue +# 2822| getStmt(5): [ReturnStmt] return ... ir23.cpp: # 1| [TopLevelFunction] bool consteval_1() # 1| : 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 d8babdb54e20..566cf07423b8 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -20430,6 +20430,247 @@ ir.cpp: # 2774| v2774_6(void) = AliasedUse : ~m2776_6 # 2774| v2774_7(void) = ExitFunction : +# 2779| void vla_sizeof_test(int, size_t, char) +# 2779| Block 0 +# 2779| v2779_1(void) = EnterFunction : +# 2779| m2779_2(unknown) = AliasedDefinition : +# 2779| m2779_3(unknown) = InitializeNonLocal : +# 2779| m2779_4(unknown) = Chi : total:m2779_2, partial:m2779_3 +# 2779| r2779_5(glval) = VariableAddress[len1] : +# 2779| m2779_6(int) = InitializeParameter[len1] : &:r2779_5 +# 2779| r2779_7(glval) = VariableAddress[len2] : +# 2779| m2779_8(unsigned long) = InitializeParameter[len2] : &:r2779_7 +# 2779| r2779_9(glval) = VariableAddress[len3] : +# 2779| m2779_10(char) = InitializeParameter[len3] : &:r2779_9 +# 2780| r2780_1(glval) = VariableAddress[tmp1] : +# 2780| m2780_2(char[]) = Uninitialized[tmp1] : &:r2780_1 +# 2780| r2780_3(glval) = VariableAddress[len1] : +# 2780| r2780_4(int) = Load[len1] : &:r2780_3, m2779_6 +# 2780| v2780_5(void) = NoOp : +# 2781| r2781_1(glval) = VariableAddress[x] : +# 2781| r2781_2(unsigned long) = Constant[1] : +# 2781| r2781_3(unsigned long) = Convert : r2780_4 +# 2781| r2781_4(unsigned long) = Mul : r2781_2, r2781_3 +# 2781| m2781_5(unsigned long) = Store[x] : &:r2781_1, r2781_4 +# 2782| r2782_1(glval) = VariableAddress[tmp2] : +# 2782| m2782_2(int[][]) = Uninitialized[tmp2] : &:r2782_1 +# 2782| r2782_3(glval) = VariableAddress[len1] : +# 2782| r2782_4(int) = Load[len1] : &:r2782_3, m2779_6 +# 2782| r2782_5(glval) = VariableAddress[len2] : +# 2782| r2782_6(unsigned long) = Load[len2] : &:r2782_5, m2779_8 +# 2782| v2782_7(void) = NoOp : +# 2783| r2783_1(glval) = VariableAddress[y] : +# 2783| r2783_2(unsigned long) = Constant[4] : +# 2783| r2783_3(unsigned long) = Convert : r2782_4 +# 2783| r2783_4(unsigned long) = Mul : r2783_2, r2783_3 +# 2783| r2783_5(unsigned long) = CopyValue : r2782_6 +# 2783| r2783_6(unsigned long) = Mul : r2783_4, r2783_5 +# 2783| m2783_7(unsigned long) = Store[y] : &:r2783_1, r2783_6 +# 2784| r2784_1(glval) = VariableAddress[z] : +# 2784| r2784_2(unsigned long) = Constant[4] : +# 2784| r2784_3(unsigned long) = CopyValue : r2782_6 +# 2784| r2784_4(unsigned long) = Mul : r2784_2, r2784_3 +# 2784| m2784_5(unsigned long) = Store[z] : &:r2784_1, r2784_4 +# 2785| r2785_1(glval) = VariableAddress[tmp3] : +# 2785| m2785_2(int[][][]) = Uninitialized[tmp3] : &:r2785_1 +# 2785| r2785_3(glval) = VariableAddress[len1] : +# 2785| r2785_4(int) = Load[len1] : &:r2785_3, m2779_6 +# 2785| r2785_5(glval) = VariableAddress[len2] : +# 2785| r2785_6(unsigned long) = Load[len2] : &:r2785_5, m2779_8 +# 2785| r2785_7(glval) = VariableAddress[len3] : +# 2785| r2785_8(char) = Load[len3] : &:r2785_7, m2779_10 +# 2785| v2785_9(void) = NoOp : +# 2786| r2786_1(glval) = VariableAddress[w] : +# 2786| r2786_2(unsigned long) = Constant[4] : +# 2786| r2786_3(unsigned long) = Convert : r2785_4 +# 2786| r2786_4(unsigned long) = Mul : r2786_2, r2786_3 +# 2786| r2786_5(unsigned long) = CopyValue : r2785_6 +# 2786| r2786_6(unsigned long) = Mul : r2786_4, r2786_5 +# 2786| r2786_7(unsigned long) = Convert : r2785_8 +# 2786| r2786_8(unsigned long) = Mul : r2786_6, r2786_7 +# 2786| m2786_9(unsigned long) = Store[w] : &:r2786_1, r2786_8 +# 2787| r2787_1(glval) = VariableAddress[v] : +# 2787| r2787_2(unsigned long) = Constant[4] : +# 2787| r2787_3(unsigned long) = CopyValue : r2785_6 +# 2787| r2787_4(unsigned long) = Mul : r2787_2, r2787_3 +# 2787| r2787_5(unsigned long) = Convert : r2785_8 +# 2787| r2787_6(unsigned long) = Mul : r2787_4, r2787_5 +# 2787| m2787_7(unsigned long) = Store[v] : &:r2787_1, r2787_6 +# 2788| r2788_1(glval) = VariableAddress[u] : +# 2788| r2788_2(unsigned long) = Constant[4] : +# 2788| r2788_3(unsigned long) = Convert : r2785_8 +# 2788| r2788_4(unsigned long) = Mul : r2788_2, r2788_3 +# 2788| m2788_5(unsigned long) = Store[u] : &:r2788_1, r2788_4 +# 2789| r2789_1(glval) = VariableAddress[t] : +# 2789| r2789_2(unsigned long) = Constant[4] : +# 2789| m2789_3(unsigned long) = Store[t] : &:r2789_1, r2789_2 +# 2790| v2790_1(void) = NoOp : +# 2779| v2779_11(void) = ReturnVoid : +# 2779| v2779_12(void) = AliasedUse : m2779_3 +# 2779| v2779_13(void) = ExitFunction : + +# 2792| void vla_sizeof_test2(int, size_t, char) +# 2792| Block 0 +# 2792| v2792_1(void) = EnterFunction : +# 2792| m2792_2(unknown) = AliasedDefinition : +# 2792| m2792_3(unknown) = InitializeNonLocal : +# 2792| m2792_4(unknown) = Chi : total:m2792_2, partial:m2792_3 +# 2792| r2792_5(glval) = VariableAddress[len1] : +# 2792| m2792_6(int) = InitializeParameter[len1] : &:r2792_5 +# 2792| r2792_7(glval) = VariableAddress[len2] : +# 2792| m2792_8(unsigned long) = InitializeParameter[len2] : &:r2792_7 +# 2792| r2792_9(glval) = VariableAddress[len3] : +# 2792| m2792_10(char) = InitializeParameter[len3] : &:r2792_9 +# 2793| r2793_1(glval) = VariableAddress[tmp1] : +# 2793| m2793_2(int[][]) = Uninitialized[tmp1] : &:r2793_1 +# 2793| r2793_3(glval) = VariableAddress[len1] : +# 2793| r2793_4(int) = Load[len1] : &:r2793_3, m2792_6 +# 2793| r2793_5(glval) = VariableAddress[len2] : +# 2793| r2793_6(unsigned long) = Load[len2] : &:r2793_5, m2792_8 +# 2793| v2793_7(void) = NoOp : +# 2794| r2794_1(glval) = VariableAddress[z] : +# 2794| r2794_2(unsigned long) = Constant[4] : +# 2794| r2794_3(unsigned long) = CopyValue : r2793_6 +# 2794| r2794_4(unsigned long) = Mul : r2794_2, r2794_3 +# 2794| m2794_5(unsigned long) = Store[z] : &:r2794_1, r2794_4 +# 2795| r2795_1(glval) = VariableAddress[tmp2] : +# 2795| m2795_2(int[][][]) = Uninitialized[tmp2] : &:r2795_1 +# 2795| r2795_3(glval) = VariableAddress[len1] : +# 2795| r2795_4(int) = Load[len1] : &:r2795_3, m2792_6 +# 2795| r2795_5(glval) = VariableAddress[len2] : +# 2795| r2795_6(unsigned long) = Load[len2] : &:r2795_5, m2792_8 +# 2795| r2795_7(glval) = VariableAddress[len3] : +# 2795| r2795_8(char) = Load[len3] : &:r2795_7, m2792_10 +# 2795| v2795_9(void) = NoOp : +# 2796| r2796_1(glval) = VariableAddress[v] : +# 2796| r2796_2(unsigned long) = Constant[4] : +# 2796| r2796_3(unsigned long) = CopyValue : r2795_6 +# 2796| r2796_4(unsigned long) = Mul : r2796_2, r2796_3 +# 2796| r2796_5(unsigned long) = Convert : r2795_8 +# 2796| r2796_6(unsigned long) = Mul : r2796_4, r2796_5 +# 2796| m2796_7(unsigned long) = Store[v] : &:r2796_1, r2796_6 +# 2797| r2797_1(glval) = VariableAddress[u] : +# 2797| r2797_2(unsigned long) = Constant[4] : +# 2797| r2797_3(unsigned long) = Convert : r2795_8 +# 2797| r2797_4(unsigned long) = Mul : r2797_2, r2797_3 +# 2797| m2797_5(unsigned long) = Store[u] : &:r2797_1, r2797_4 +# 2798| r2798_1(glval) = VariableAddress[t] : +# 2798| r2798_2(unsigned long) = Constant[4] : +# 2798| m2798_3(unsigned long) = Store[t] : &:r2798_1, r2798_2 +# 2799| v2799_1(void) = NoOp : +# 2792| v2792_11(void) = ReturnVoid : +# 2792| v2792_12(void) = AliasedUse : m2792_3 +# 2792| v2792_13(void) = ExitFunction : + +# 2801| size_t vla_sizeof_test3(int, size_t, char, bool) +# 2801| Block 0 +# 2801| v2801_1(void) = EnterFunction : +# 2801| m2801_2(unknown) = AliasedDefinition : +# 2801| m2801_3(unknown) = InitializeNonLocal : +# 2801| m2801_4(unknown) = Chi : total:m2801_2, partial:m2801_3 +# 2801| r2801_5(glval) = VariableAddress[len1] : +# 2801| m2801_6(int) = InitializeParameter[len1] : &:r2801_5 +# 2801| r2801_7(glval) = VariableAddress[len2] : +# 2801| m2801_8(unsigned long) = InitializeParameter[len2] : &:r2801_7 +# 2801| r2801_9(glval) = VariableAddress[len3] : +# 2801| m2801_10(char) = InitializeParameter[len3] : &:r2801_9 +# 2801| r2801_11(glval) = VariableAddress[b] : +# 2801| m2801_12(bool) = InitializeParameter[b] : &:r2801_11 +# 2802| r2802_1(glval) = VariableAddress[len1] : +# 2802| r2802_2(int) = Load[len1] : &:r2802_1, m2801_6 +# 2802| r2802_3(glval) = VariableAddress[len2] : +# 2802| r2802_4(unsigned long) = Load[len2] : &:r2802_3, m2801_8 +# 2802| v2802_5(void) = NoOp : +# 2803| v2803_1(void) = NoOp : +# 2804| r2804_1(glval) = VariableAddress[len3] : +# 2804| r2804_2(char) = Load[len3] : &:r2804_1, m2801_10 +# 2804| v2804_3(void) = NoOp : +# 2806| r2806_1(glval) = VariableAddress[b] : +# 2806| r2806_2(bool) = Load[b] : &:r2806_1, m2801_12 +# 2806| v2806_3(void) = ConditionalBranch : r2806_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2801| Block 1 +# 2801| m2801_13(unsigned long) = Phi : from 2:m2808_7, from 3:m2811_3 +# 2801| r2801_14(glval) = VariableAddress[#return] : +# 2801| v2801_15(void) = ReturnValue : &:r2801_14, m2801_13 +# 2801| v2801_16(void) = AliasedUse : m2801_3 +# 2801| v2801_17(void) = ExitFunction : + +# 2807| Block 2 +# 2807| r2807_1(glval) = VariableAddress[tmp] : +# 2807| m2807_2(long[][][]) = Uninitialized[tmp] : &:r2807_1 +# 2807| v2807_3(void) = NoOp : +# 2808| r2808_1(glval) = VariableAddress[#return] : +# 2808| r2808_2(unsigned long) = Constant[8] : +# 2808| r2808_3(unsigned long) = Convert : r2802_2 +# 2808| r2808_4(unsigned long) = Mul : r2808_2, r2808_3 +# 2808| r2808_5(unsigned long) = CopyValue : r2802_4 +# 2808| r2808_6(unsigned long) = Mul : r2808_4, r2808_5 +# 2808| m2808_7(unsigned long) = Store[#return] : &:r2808_1, r2808_6 +#-----| Goto -> Block 1 + +# 2811| Block 3 +# 2811| r2811_1(glval) = VariableAddress[#return] : +# 2811| r2811_2(unsigned long) = Constant[0] : +# 2811| m2811_3(unsigned long) = Store[#return] : &:r2811_1, r2811_2 +#-----| Goto -> Block 1 + +# 2814| void vla_sizeof_test4(int, size_t) +# 2814| Block 0 +# 2814| v2814_1(void) = EnterFunction : +# 2814| m2814_2(unknown) = AliasedDefinition : +# 2814| m2814_3(unknown) = InitializeNonLocal : +# 2814| m2814_4(unknown) = Chi : total:m2814_2, partial:m2814_3 +# 2814| r2814_5(glval) = VariableAddress[len1] : +# 2814| m2814_6(int) = InitializeParameter[len1] : &:r2814_5 +# 2814| r2814_7(glval) = VariableAddress[len2] : +# 2814| m2814_8(unsigned long) = InitializeParameter[len2] : &:r2814_7 +# 2815| r2815_1(glval) = VariableAddress[tmp1] : +# 2815| m2815_2(int[][]) = Uninitialized[tmp1] : &:r2815_1 +# 2815| r2815_3(glval) = VariableAddress[len1] : +# 2815| r2815_4(int) = Load[len1] : &:r2815_3, m2814_6 +# 2815| r2815_5(glval) = VariableAddress[len2] : +# 2815| r2815_6(unsigned long) = Load[len2] : &:r2815_5, m2814_8 +# 2815| v2815_7(void) = NoOp : +# 2816| r2816_1(glval) = VariableAddress[z] : +# 2816| r2816_2(unsigned long) = Constant[4] : +# 2816| r2816_3(unsigned long) = CopyValue : r2815_6 +# 2816| r2816_4(unsigned long) = Mul : r2816_2, r2816_3 +# 2816| m2816_5(unsigned long) = Store[z] : &:r2816_1, r2816_4 +# 2817| v2817_1(void) = NoOp : +# 2814| v2814_9(void) = ReturnVoid : +# 2814| v2814_10(void) = AliasedUse : m2814_3 +# 2814| v2814_11(void) = ExitFunction : + +# 2819| void vla_sizeof_test5(int, size_t) +# 2819| Block 0 +# 2819| v2819_1(void) = EnterFunction : +# 2819| m2819_2(unknown) = AliasedDefinition : +# 2819| m2819_3(unknown) = InitializeNonLocal : +# 2819| m2819_4(unknown) = Chi : total:m2819_2, partial:m2819_3 +# 2819| r2819_5(glval) = VariableAddress[len1] : +# 2819| m2819_6(int) = InitializeParameter[len1] : &:r2819_5 +# 2819| r2819_7(glval) = VariableAddress[len2] : +# 2819| m2819_8(unsigned long) = InitializeParameter[len2] : &:r2819_7 +# 2820| r2820_1(glval) = VariableAddress[tmp1] : +# 2820| m2820_2(int[][]) = Uninitialized[tmp1] : &:r2820_1 +# 2820| r2820_3(glval) = VariableAddress[len1] : +# 2820| r2820_4(int) = Load[len1] : &:r2820_3, m2819_6 +# 2820| r2820_5(glval) = VariableAddress[len2] : +# 2820| r2820_6(unsigned long) = Load[len2] : &:r2820_5, m2819_8 +# 2820| v2820_7(void) = NoOp : +# 2821| r2821_1(glval) = VariableAddress[z] : +# 2821| r2821_2(unsigned long) = Constant[4] : +# 2821| r2821_3(unsigned long) = CopyValue : r2820_6 +# 2821| r2821_4(unsigned long) = Mul : r2821_2, r2821_3 +# 2821| m2821_5(unsigned long) = Store[z] : &:r2821_1, r2821_4 +# 2822| v2822_1(void) = NoOp : +# 2819| v2819_9(void) = ReturnVoid : +# 2819| v2819_10(void) = AliasedUse : m2819_3 +# 2819| v2819_11(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 66af788db12d..3dce0a0e1ea9 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2776,4 +2776,49 @@ void test_allocation_with_initializer() { long* p2 = new long(42); } +void vla_sizeof_test(int len1, size_t len2, char len3) { + char tmp1[len1]; + size_t x = sizeof(tmp1); + int tmp2[len1][len2]; + size_t y = sizeof(tmp2); + size_t z = sizeof(*tmp2); + int tmp3[len1][len2][len3]; + size_t w = sizeof(tmp3); + size_t v = sizeof(*tmp3); + size_t u = sizeof(**tmp3); + size_t t = sizeof(***tmp3); +} + +void vla_sizeof_test2(int len1, size_t len2, char len3) { + int tmp1[len1][len2]; + size_t z = sizeof(tmp1[1]); + int tmp2[len1][len2][len3]; + size_t v = sizeof(tmp2[1]); + size_t u = sizeof(tmp2[1][2]); + size_t t = sizeof(tmp2[1][2][3]); +} + +size_t vla_sizeof_test3(int len1, size_t len2, char len3, bool b) { + typedef long arr[len1][len2]; + typedef arr arr2; + typedef arr2 arr3[len3]; + + if (b) { + arr3 tmp; + return sizeof(tmp[1]); + } + + return 0; +} + +void vla_sizeof_test4(int len1, size_t len2) { + int tmp1[len1][len2]; + size_t z = sizeof(1[tmp1]); +} + +void vla_sizeof_test5(int len1, size_t len2) { + int tmp1[len1][len2]; + size_t z = sizeof((*&tmp1)[1]); +} + // semmle-extractor-options: -std=c++20 --clang 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 a567c651ca24..1d8f885cd15b 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -18577,6 +18577,241 @@ ir.cpp: # 2774| v2774_5(void) = AliasedUse : ~m? # 2774| v2774_6(void) = ExitFunction : +# 2779| void vla_sizeof_test(int, size_t, char) +# 2779| Block 0 +# 2779| v2779_1(void) = EnterFunction : +# 2779| mu2779_2(unknown) = AliasedDefinition : +# 2779| mu2779_3(unknown) = InitializeNonLocal : +# 2779| r2779_4(glval) = VariableAddress[len1] : +# 2779| mu2779_5(int) = InitializeParameter[len1] : &:r2779_4 +# 2779| r2779_6(glval) = VariableAddress[len2] : +# 2779| mu2779_7(unsigned long) = InitializeParameter[len2] : &:r2779_6 +# 2779| r2779_8(glval) = VariableAddress[len3] : +# 2779| mu2779_9(char) = InitializeParameter[len3] : &:r2779_8 +# 2780| r2780_1(glval) = VariableAddress[tmp1] : +# 2780| mu2780_2(char[]) = Uninitialized[tmp1] : &:r2780_1 +# 2780| r2780_3(glval) = VariableAddress[len1] : +# 2780| r2780_4(int) = Load[len1] : &:r2780_3, ~m? +# 2780| v2780_5(void) = NoOp : +# 2781| r2781_1(glval) = VariableAddress[x] : +# 2781| r2781_2(unsigned long) = Constant[1] : +# 2781| r2781_3(unsigned long) = Convert : r2780_4 +# 2781| r2781_4(unsigned long) = Mul : r2781_2, r2781_3 +# 2781| mu2781_5(unsigned long) = Store[x] : &:r2781_1, r2781_4 +# 2782| r2782_1(glval) = VariableAddress[tmp2] : +# 2782| mu2782_2(int[][]) = Uninitialized[tmp2] : &:r2782_1 +# 2782| r2782_3(glval) = VariableAddress[len1] : +# 2782| r2782_4(int) = Load[len1] : &:r2782_3, ~m? +# 2782| r2782_5(glval) = VariableAddress[len2] : +# 2782| r2782_6(unsigned long) = Load[len2] : &:r2782_5, ~m? +# 2782| v2782_7(void) = NoOp : +# 2783| r2783_1(glval) = VariableAddress[y] : +# 2783| r2783_2(unsigned long) = Constant[4] : +# 2783| r2783_3(unsigned long) = Convert : r2782_4 +# 2783| r2783_4(unsigned long) = Mul : r2783_2, r2783_3 +# 2783| r2783_5(unsigned long) = CopyValue : r2782_6 +# 2783| r2783_6(unsigned long) = Mul : r2783_4, r2783_5 +# 2783| mu2783_7(unsigned long) = Store[y] : &:r2783_1, r2783_6 +# 2784| r2784_1(glval) = VariableAddress[z] : +# 2784| r2784_2(unsigned long) = Constant[4] : +# 2784| r2784_3(unsigned long) = CopyValue : r2782_6 +# 2784| r2784_4(unsigned long) = Mul : r2784_2, r2784_3 +# 2784| mu2784_5(unsigned long) = Store[z] : &:r2784_1, r2784_4 +# 2785| r2785_1(glval) = VariableAddress[tmp3] : +# 2785| mu2785_2(int[][][]) = Uninitialized[tmp3] : &:r2785_1 +# 2785| r2785_3(glval) = VariableAddress[len1] : +# 2785| r2785_4(int) = Load[len1] : &:r2785_3, ~m? +# 2785| r2785_5(glval) = VariableAddress[len2] : +# 2785| r2785_6(unsigned long) = Load[len2] : &:r2785_5, ~m? +# 2785| r2785_7(glval) = VariableAddress[len3] : +# 2785| r2785_8(char) = Load[len3] : &:r2785_7, ~m? +# 2785| v2785_9(void) = NoOp : +# 2786| r2786_1(glval) = VariableAddress[w] : +# 2786| r2786_2(unsigned long) = Constant[4] : +# 2786| r2786_3(unsigned long) = Convert : r2785_4 +# 2786| r2786_4(unsigned long) = Mul : r2786_2, r2786_3 +# 2786| r2786_5(unsigned long) = CopyValue : r2785_6 +# 2786| r2786_6(unsigned long) = Mul : r2786_4, r2786_5 +# 2786| r2786_7(unsigned long) = Convert : r2785_8 +# 2786| r2786_8(unsigned long) = Mul : r2786_6, r2786_7 +# 2786| mu2786_9(unsigned long) = Store[w] : &:r2786_1, r2786_8 +# 2787| r2787_1(glval) = VariableAddress[v] : +# 2787| r2787_2(unsigned long) = Constant[4] : +# 2787| r2787_3(unsigned long) = CopyValue : r2785_6 +# 2787| r2787_4(unsigned long) = Mul : r2787_2, r2787_3 +# 2787| r2787_5(unsigned long) = Convert : r2785_8 +# 2787| r2787_6(unsigned long) = Mul : r2787_4, r2787_5 +# 2787| mu2787_7(unsigned long) = Store[v] : &:r2787_1, r2787_6 +# 2788| r2788_1(glval) = VariableAddress[u] : +# 2788| r2788_2(unsigned long) = Constant[4] : +# 2788| r2788_3(unsigned long) = Convert : r2785_8 +# 2788| r2788_4(unsigned long) = Mul : r2788_2, r2788_3 +# 2788| mu2788_5(unsigned long) = Store[u] : &:r2788_1, r2788_4 +# 2789| r2789_1(glval) = VariableAddress[t] : +# 2789| r2789_2(unsigned long) = Constant[4] : +# 2789| mu2789_3(unsigned long) = Store[t] : &:r2789_1, r2789_2 +# 2790| v2790_1(void) = NoOp : +# 2779| v2779_10(void) = ReturnVoid : +# 2779| v2779_11(void) = AliasedUse : ~m? +# 2779| v2779_12(void) = ExitFunction : + +# 2792| void vla_sizeof_test2(int, size_t, char) +# 2792| Block 0 +# 2792| v2792_1(void) = EnterFunction : +# 2792| mu2792_2(unknown) = AliasedDefinition : +# 2792| mu2792_3(unknown) = InitializeNonLocal : +# 2792| r2792_4(glval) = VariableAddress[len1] : +# 2792| mu2792_5(int) = InitializeParameter[len1] : &:r2792_4 +# 2792| r2792_6(glval) = VariableAddress[len2] : +# 2792| mu2792_7(unsigned long) = InitializeParameter[len2] : &:r2792_6 +# 2792| r2792_8(glval) = VariableAddress[len3] : +# 2792| mu2792_9(char) = InitializeParameter[len3] : &:r2792_8 +# 2793| r2793_1(glval) = VariableAddress[tmp1] : +# 2793| mu2793_2(int[][]) = Uninitialized[tmp1] : &:r2793_1 +# 2793| r2793_3(glval) = VariableAddress[len1] : +# 2793| r2793_4(int) = Load[len1] : &:r2793_3, ~m? +# 2793| r2793_5(glval) = VariableAddress[len2] : +# 2793| r2793_6(unsigned long) = Load[len2] : &:r2793_5, ~m? +# 2793| v2793_7(void) = NoOp : +# 2794| r2794_1(glval) = VariableAddress[z] : +# 2794| r2794_2(unsigned long) = Constant[4] : +# 2794| r2794_3(unsigned long) = CopyValue : r2793_6 +# 2794| r2794_4(unsigned long) = Mul : r2794_2, r2794_3 +# 2794| mu2794_5(unsigned long) = Store[z] : &:r2794_1, r2794_4 +# 2795| r2795_1(glval) = VariableAddress[tmp2] : +# 2795| mu2795_2(int[][][]) = Uninitialized[tmp2] : &:r2795_1 +# 2795| r2795_3(glval) = VariableAddress[len1] : +# 2795| r2795_4(int) = Load[len1] : &:r2795_3, ~m? +# 2795| r2795_5(glval) = VariableAddress[len2] : +# 2795| r2795_6(unsigned long) = Load[len2] : &:r2795_5, ~m? +# 2795| r2795_7(glval) = VariableAddress[len3] : +# 2795| r2795_8(char) = Load[len3] : &:r2795_7, ~m? +# 2795| v2795_9(void) = NoOp : +# 2796| r2796_1(glval) = VariableAddress[v] : +# 2796| r2796_2(unsigned long) = Constant[4] : +# 2796| r2796_3(unsigned long) = CopyValue : r2795_6 +# 2796| r2796_4(unsigned long) = Mul : r2796_2, r2796_3 +# 2796| r2796_5(unsigned long) = Convert : r2795_8 +# 2796| r2796_6(unsigned long) = Mul : r2796_4, r2796_5 +# 2796| mu2796_7(unsigned long) = Store[v] : &:r2796_1, r2796_6 +# 2797| r2797_1(glval) = VariableAddress[u] : +# 2797| r2797_2(unsigned long) = Constant[4] : +# 2797| r2797_3(unsigned long) = Convert : r2795_8 +# 2797| r2797_4(unsigned long) = Mul : r2797_2, r2797_3 +# 2797| mu2797_5(unsigned long) = Store[u] : &:r2797_1, r2797_4 +# 2798| r2798_1(glval) = VariableAddress[t] : +# 2798| r2798_2(unsigned long) = Constant[4] : +# 2798| mu2798_3(unsigned long) = Store[t] : &:r2798_1, r2798_2 +# 2799| v2799_1(void) = NoOp : +# 2792| v2792_10(void) = ReturnVoid : +# 2792| v2792_11(void) = AliasedUse : ~m? +# 2792| v2792_12(void) = ExitFunction : + +# 2801| size_t vla_sizeof_test3(int, size_t, char, bool) +# 2801| Block 0 +# 2801| v2801_1(void) = EnterFunction : +# 2801| mu2801_2(unknown) = AliasedDefinition : +# 2801| mu2801_3(unknown) = InitializeNonLocal : +# 2801| r2801_4(glval) = VariableAddress[len1] : +# 2801| mu2801_5(int) = InitializeParameter[len1] : &:r2801_4 +# 2801| r2801_6(glval) = VariableAddress[len2] : +# 2801| mu2801_7(unsigned long) = InitializeParameter[len2] : &:r2801_6 +# 2801| r2801_8(glval) = VariableAddress[len3] : +# 2801| mu2801_9(char) = InitializeParameter[len3] : &:r2801_8 +# 2801| r2801_10(glval) = VariableAddress[b] : +# 2801| mu2801_11(bool) = InitializeParameter[b] : &:r2801_10 +# 2802| r2802_1(glval) = VariableAddress[len1] : +# 2802| r2802_2(int) = Load[len1] : &:r2802_1, ~m? +# 2802| r2802_3(glval) = VariableAddress[len2] : +# 2802| r2802_4(unsigned long) = Load[len2] : &:r2802_3, ~m? +# 2802| v2802_5(void) = NoOp : +# 2803| v2803_1(void) = NoOp : +# 2804| r2804_1(glval) = VariableAddress[len3] : +# 2804| r2804_2(char) = Load[len3] : &:r2804_1, ~m? +# 2804| v2804_3(void) = NoOp : +# 2806| r2806_1(glval) = VariableAddress[b] : +# 2806| r2806_2(bool) = Load[b] : &:r2806_1, ~m? +# 2806| v2806_3(void) = ConditionalBranch : r2806_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 2801| Block 1 +# 2801| r2801_12(glval) = VariableAddress[#return] : +# 2801| v2801_13(void) = ReturnValue : &:r2801_12, ~m? +# 2801| v2801_14(void) = AliasedUse : ~m? +# 2801| v2801_15(void) = ExitFunction : + +# 2807| Block 2 +# 2807| r2807_1(glval) = VariableAddress[tmp] : +# 2807| mu2807_2(long[][][]) = Uninitialized[tmp] : &:r2807_1 +# 2807| v2807_3(void) = NoOp : +# 2808| r2808_1(glval) = VariableAddress[#return] : +# 2808| r2808_2(unsigned long) = Constant[8] : +# 2808| r2808_3(unsigned long) = Convert : r2802_2 +# 2808| r2808_4(unsigned long) = Mul : r2808_2, r2808_3 +# 2808| r2808_5(unsigned long) = CopyValue : r2802_4 +# 2808| r2808_6(unsigned long) = Mul : r2808_4, r2808_5 +# 2808| mu2808_7(unsigned long) = Store[#return] : &:r2808_1, r2808_6 +#-----| Goto -> Block 1 + +# 2811| Block 3 +# 2811| r2811_1(glval) = VariableAddress[#return] : +# 2811| r2811_2(unsigned long) = Constant[0] : +# 2811| mu2811_3(unsigned long) = Store[#return] : &:r2811_1, r2811_2 +#-----| Goto -> Block 1 + +# 2814| void vla_sizeof_test4(int, size_t) +# 2814| Block 0 +# 2814| v2814_1(void) = EnterFunction : +# 2814| mu2814_2(unknown) = AliasedDefinition : +# 2814| mu2814_3(unknown) = InitializeNonLocal : +# 2814| r2814_4(glval) = VariableAddress[len1] : +# 2814| mu2814_5(int) = InitializeParameter[len1] : &:r2814_4 +# 2814| r2814_6(glval) = VariableAddress[len2] : +# 2814| mu2814_7(unsigned long) = InitializeParameter[len2] : &:r2814_6 +# 2815| r2815_1(glval) = VariableAddress[tmp1] : +# 2815| mu2815_2(int[][]) = Uninitialized[tmp1] : &:r2815_1 +# 2815| r2815_3(glval) = VariableAddress[len1] : +# 2815| r2815_4(int) = Load[len1] : &:r2815_3, ~m? +# 2815| r2815_5(glval) = VariableAddress[len2] : +# 2815| r2815_6(unsigned long) = Load[len2] : &:r2815_5, ~m? +# 2815| v2815_7(void) = NoOp : +# 2816| r2816_1(glval) = VariableAddress[z] : +# 2816| r2816_2(unsigned long) = Constant[4] : +# 2816| r2816_3(unsigned long) = CopyValue : r2815_6 +# 2816| r2816_4(unsigned long) = Mul : r2816_2, r2816_3 +# 2816| mu2816_5(unsigned long) = Store[z] : &:r2816_1, r2816_4 +# 2817| v2817_1(void) = NoOp : +# 2814| v2814_8(void) = ReturnVoid : +# 2814| v2814_9(void) = AliasedUse : ~m? +# 2814| v2814_10(void) = ExitFunction : + +# 2819| void vla_sizeof_test5(int, size_t) +# 2819| Block 0 +# 2819| v2819_1(void) = EnterFunction : +# 2819| mu2819_2(unknown) = AliasedDefinition : +# 2819| mu2819_3(unknown) = InitializeNonLocal : +# 2819| r2819_4(glval) = VariableAddress[len1] : +# 2819| mu2819_5(int) = InitializeParameter[len1] : &:r2819_4 +# 2819| r2819_6(glval) = VariableAddress[len2] : +# 2819| mu2819_7(unsigned long) = InitializeParameter[len2] : &:r2819_6 +# 2820| r2820_1(glval) = VariableAddress[tmp1] : +# 2820| mu2820_2(int[][]) = Uninitialized[tmp1] : &:r2820_1 +# 2820| r2820_3(glval) = VariableAddress[len1] : +# 2820| r2820_4(int) = Load[len1] : &:r2820_3, ~m? +# 2820| r2820_5(glval) = VariableAddress[len2] : +# 2820| r2820_6(unsigned long) = Load[len2] : &:r2820_5, ~m? +# 2820| v2820_7(void) = NoOp : +# 2821| r2821_1(glval) = VariableAddress[z] : +# 2821| r2821_2(unsigned long) = Constant[4] : +# 2821| r2821_3(unsigned long) = CopyValue : r2820_6 +# 2821| r2821_4(unsigned long) = Mul : r2821_2, r2821_3 +# 2821| mu2821_5(unsigned long) = Store[z] : &:r2821_1, r2821_4 +# 2822| v2822_1(void) = NoOp : +# 2819| v2819_8(void) = ReturnVoid : +# 2819| v2819_9(void) = AliasedUse : ~m? +# 2819| v2819_10(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 diff --git a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected index b516aa0ce875..76adedb8f054 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected @@ -48,21 +48,10 @@ argHasPostUpdate | ir.cpp:623:5:623:5 | r | ArgumentNode is missing PostUpdateNode. | | ir.cpp:625:5:625:5 | s | ArgumentNode is missing PostUpdateNode. | postWithInFlow -| VacuousDestructorCall.cpp:10:22:10:22 | i [inner post update] | PostUpdateNode should not be the target of local flow. | | allocators.cpp:4:18:4:20 | m_x [post update] | PostUpdateNode should not be the target of local flow. | | allocators.cpp:4:24:4:26 | m_y [post update] | PostUpdateNode should not be the target of local flow. | | assignexpr.cpp:11:4:11:4 | i [post update] | PostUpdateNode should not be the target of local flow. | -| builtin.c:34:23:34:31 | staticint [inner post update] | PostUpdateNode should not be the target of local flow. | -| builtin.c:39:37:39:45 | carry_out [inner post update] | PostUpdateNode should not be the target of local flow. | -| builtin.c:43:41:43:49 | staticint [inner post update] | PostUpdateNode should not be the target of local flow. | -| builtin.c:51:30:51:38 | staticint [inner post update] | PostUpdateNode should not be the target of local flow. | -| builtin.c:54:29:54:38 | atomic_int [inner post update] | PostUpdateNode should not be the target of local flow. | | condition_decls.cpp:3:5:3:9 | m_ptr [post update] | PostUpdateNode should not be the target of local flow. | -| condition_decls.cpp:17:11:17:15 | m_ptr [inner post update] | PostUpdateNode should not be the target of local flow. | -| condition_decls.cpp:20:11:20:15 | m_ptr [inner post update] | PostUpdateNode should not be the target of local flow. | -| condition_decls.cpp:28:11:28:15 | m_ptr [inner post update] | PostUpdateNode should not be the target of local flow. | -| condition_decls.cpp:31:11:31:15 | m_ptr [inner post update] | PostUpdateNode should not be the target of local flow. | -| condition_decls.cpp:34:9:34:13 | m_ptr [inner post update] | PostUpdateNode should not be the target of local flow. | | conditional_destructors.cpp:6:13:6:15 | val [post update] | PostUpdateNode should not be the target of local flow. | | conditional_destructors.cpp:18:13:18:15 | val [post update] | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:7:7:7:8 | el [post update] | PostUpdateNode should not be the target of local flow. | @@ -70,26 +59,16 @@ postWithInFlow | cpp11.cpp:82:11:82:14 | call to Val | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:82:45:82:48 | call to Val | PostUpdateNode should not be the target of local flow. | | cpp11.cpp:82:51:82:51 | call to Val | PostUpdateNode should not be the target of local flow. | -| ir.cpp:177:5:177:5 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:177:5:177:8 | access to array [post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:178:5:178:8 | access to array [post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:178:7:178:7 | p [inner post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:183:5:183:5 | a [inner post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:183:5:183:8 | access to array [post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:184:5:184:8 | access to array [post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:184:7:184:7 | a [inner post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:342:5:342:6 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:342:6:342:6 | p [inner post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:428:8:428:8 | x [post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:429:8:429:8 | y [post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:644:15:644:17 | m_a [post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:645:11:645:14 | this [inner post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:645:17:645:19 | m_a [post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:646:9:646:11 | m_a [post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:655:11:655:14 | this [inner post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:747:8:747:8 | base_s [inner post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:756:8:756:8 | middle_s [inner post update] | PostUpdateNode should not be the target of local flow. | -| ir.cpp:765:8:765:8 | derived_s [inner post update] | PostUpdateNode should not be the target of local flow. | | ir.cpp:811:7:811:13 | call to Base | PostUpdateNode should not be the target of local flow. | | ir.cpp:812:7:812:26 | call to Base | PostUpdateNode should not be the target of local flow. | | ir.cpp:825:7:825:13 | call to Base | PostUpdateNode should not be the target of local flow. | @@ -97,7 +76,6 @@ postWithInFlow | misc.c:130:7:130:7 | i [post update] | PostUpdateNode should not be the target of local flow. | | misc.c:131:9:131:9 | i [post update] | PostUpdateNode should not be the target of local flow. | | misc.c:220:3:220:5 | * ... [post update] | PostUpdateNode should not be the target of local flow. | -| misc.c:220:4:220:5 | sp [inner post update] | PostUpdateNode should not be the target of local flow. | | static_init_templates.cpp:3:2:3:4 | ref [post update] | PostUpdateNode should not be the target of local flow. | | static_init_templates.cpp:21:2:21:4 | val [post update] | PostUpdateNode should not be the target of local flow. | | try_catch.cpp:7:8:7:8 | call to exception | PostUpdateNode should not be the target of local flow. | diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/tests/too_many_constants.cpp b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/tests/too_many_constants.cpp new file mode 100644 index 000000000000..2e794f387ce8 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-457/semmle/tests/too_many_constants.cpp @@ -0,0 +1,42 @@ +struct S { + int a; + int b; + int c; + unsigned long *d; + + union { + struct { + const char *e; + int f; + S *g; + const char *h; + int i; + bool j; + bool k; + const char *l; + char **m; + } n; + + struct { + bool o; + bool p; + } q; + } r; +}; + +int too_many_constants_init(S *s); + +char *too_many_constants(const char *h, bool k, int i) { + const char *e = ""; + char l[64] = ""; + char *m; + + S s[] = { + {.a = 0, .c = 0, .d = nullptr, .r = {.n = {.e = e, .f = 1, .g = nullptr, .h = h, .i = i, .j = false, .k = k, .l = l, .m = &m}}}, + {.a = 0, .c = 0, .d = nullptr, .r = {.q = {.o = true, .p = true}}} + }; + + too_many_constants_init(s); + + return m; // GOOD - initialized by too_many_constants_init +} diff --git a/csharp/actions/create-extractor-pack/action.yml b/csharp/actions/create-extractor-pack/action.yml index 6c6b3af82b02..b6737b45ad66 100644 --- a/csharp/actions/create-extractor-pack/action.yml +++ b/csharp/actions/create-extractor-pack/action.yml @@ -7,7 +7,7 @@ runs: - name: Setup dotnet uses: actions/setup-dotnet@v4 with: - dotnet-version: 9.0.100 + dotnet-version: 9.0.300 - name: Build Extractor shell: bash run: scripts/create-extractor-pack.sh diff --git a/csharp/documentation/library-coverage/coverage.csv b/csharp/documentation/library-coverage/coverage.csv index 72c46c89934a..4713679cd233 100644 --- a/csharp/documentation/library-coverage/coverage.csv +++ b/csharp/documentation/library-coverage/coverage.csv @@ -43,5 +43,5 @@ MySql.Data.MySqlClient,48,,,,,,,,,,,,48,,,,,,,,,, Newtonsoft.Json,,,91,,,,,,,,,,,,,,,,,,,73,18 ServiceStack,194,,7,27,,,,,75,,,,92,,,,,,,,,7, SourceGenerators,,,5,,,,,,,,,,,,,,,,,,,,5 -System,54,47,12165,,6,5,5,,,4,1,,33,2,,6,15,17,4,3,,5929,6236 +System,54,47,12241,,6,5,5,,,4,1,,33,2,,6,15,17,4,3,,6003,6238 Windows.Security.Cryptography.Core,1,,,,,,,1,,,,,,,,,,,,,,, diff --git a/csharp/documentation/library-coverage/coverage.rst b/csharp/documentation/library-coverage/coverage.rst index c1c3f927fd7d..061662f97149 100644 --- a/csharp/documentation/library-coverage/coverage.rst +++ b/csharp/documentation/library-coverage/coverage.rst @@ -8,7 +8,7 @@ C# framework & library support Framework / library,Package,Flow sources,Taint & value steps,Sinks (total),`CWE-079` :sub:`Cross-site scripting` `ServiceStack `_,"``ServiceStack.*``, ``ServiceStack``",,7,194, - System,"``System.*``, ``System``",47,12165,54,5 + System,"``System.*``, ``System``",47,12241,54,5 Others,"``Amazon.Lambda.APIGatewayEvents``, ``Amazon.Lambda.Core``, ``Dapper``, ``ILCompiler``, ``ILLink.RoslynAnalyzer``, ``ILLink.Shared``, ``ILLink.Tasks``, ``Internal.IL``, ``Internal.Pgo``, ``Internal.TypeSystem``, ``Microsoft.ApplicationBlocks.Data``, ``Microsoft.AspNetCore.Components``, ``Microsoft.AspNetCore.Http``, ``Microsoft.AspNetCore.Mvc``, ``Microsoft.AspNetCore.WebUtilities``, ``Microsoft.CSharp``, ``Microsoft.Data.SqlClient``, ``Microsoft.Diagnostics.Tools.Pgo``, ``Microsoft.DotNet.Build.Tasks``, ``Microsoft.DotNet.PlatformAbstractions``, ``Microsoft.EntityFrameworkCore``, ``Microsoft.Extensions.Caching.Distributed``, ``Microsoft.Extensions.Caching.Memory``, ``Microsoft.Extensions.Configuration``, ``Microsoft.Extensions.DependencyInjection``, ``Microsoft.Extensions.DependencyModel``, ``Microsoft.Extensions.Diagnostics.Metrics``, ``Microsoft.Extensions.FileProviders``, ``Microsoft.Extensions.FileSystemGlobbing``, ``Microsoft.Extensions.Hosting``, ``Microsoft.Extensions.Http``, ``Microsoft.Extensions.Logging``, ``Microsoft.Extensions.Options``, ``Microsoft.Extensions.Primitives``, ``Microsoft.Interop``, ``Microsoft.JSInterop``, ``Microsoft.NET.Build.Tasks``, ``Microsoft.VisualBasic``, ``Microsoft.Win32``, ``Mono.Linker``, ``MySql.Data.MySqlClient``, ``Newtonsoft.Json``, ``SourceGenerators``, ``Windows.Security.Cryptography.Core``",60,2257,159,4 - Totals,,107,14429,407,9 + Totals,,107,14505,407,9 diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index c71013bf7a01..4a4fd651a5b3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -138,7 +138,7 @@ public IList GetNugetFeedsFromFolder(string folderPath) } // The version number should be kept in sync with the version .NET version used for building the application. - public const string LatestDotNetSdkVersion = "9.0.100"; + public const string LatestDotNetSdkVersion = "9.0.300"; /// /// Returns a script for downloading relevant versions of the diff --git a/csharp/paket.main_extension.bzl b/csharp/paket.main_extension.bzl index 6d356fb47cd1..91f53cc20e3b 100644 --- a/csharp/paket.main_extension.bzl +++ b/csharp/paket.main_extension.bzl @@ -2,8 +2,9 @@ load(":paket.main.bzl", _main = "main") -def _main_impl(_ctx): +def _main_impl(module_ctx): _main() + return module_ctx.extension_metadata(reproducible = True) main_extension = module_extension( implementation = _main_impl, diff --git a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md index 7f3f4d436831..41b8b166a6c6 100644 --- a/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.48 + +No user-facing changes. + ## 1.7.47 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.48.md b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.48.md new file mode 100644 index 000000000000..5f90b4d64193 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/lib/change-notes/released/1.7.48.md @@ -0,0 +1,3 @@ +## 1.7.48 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml index 21f0fc0de3c1..f5fe8023097c 100644 --- a/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.47 +lastReleaseVersion: 1.7.48 diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index eec8eedc6568..8b069392a0b3 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.47 +version: 1.7.48 groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md index 7f3f4d436831..41b8b166a6c6 100644 --- a/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md +++ b/csharp/ql/campaigns/Solorigate/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.7.48 + +No user-facing changes. + ## 1.7.47 No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.48.md b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.48.md new file mode 100644 index 000000000000..5f90b4d64193 --- /dev/null +++ b/csharp/ql/campaigns/Solorigate/src/change-notes/released/1.7.48.md @@ -0,0 +1,3 @@ +## 1.7.48 + +No user-facing changes. diff --git a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml index 21f0fc0de3c1..f5fe8023097c 100644 --- a/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml +++ b/csharp/ql/campaigns/Solorigate/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.47 +lastReleaseVersion: 1.7.48 diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 165e362e6c6f..197f3182a634 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.47 +version: 1.7.48 groups: - csharp - solorigate diff --git a/csharp/ql/integration-tests/all-platforms/autobuild/global.json b/csharp/ql/integration-tests/all-platforms/autobuild/global.json index 7a0e39d71fa7..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/autobuild/global.json +++ b/csharp/ql/integration-tests/all-platforms/autobuild/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } -} \ No newline at end of file +} diff --git a/csharp/ql/integration-tests/all-platforms/binlog/global.json b/csharp/ql/integration-tests/all-platforms/binlog/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog/global.json +++ b/csharp/ql/integration-tests/all-platforms/binlog/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json b/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json +++ b/csharp/ql/integration-tests/all-platforms/binlog_multiple/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json index 7a0e39d71fa7..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json +++ b/csharp/ql/integration-tests/all-platforms/blazor/BlazorTest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } -} \ No newline at end of file +} diff --git a/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected b/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected index 795e9ad7de08..2129be6da473 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected +++ b/csharp/ql/integration-tests/all-platforms/blazor/XSS.expected @@ -3,8 +3,8 @@ | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | $@ flows to here and is written to HTML or JavaScript. | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | User-provided value | | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | $@ flows to here and is written to HTML or JavaScript. | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | User-provided value | edges -| BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:569:16:577:13 | call to method TypeCheck : String | provenance | Src:MaD:2 MaD:3 | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:569:16:577:13 | call to method TypeCheck : String | BlazorTest/Components/MyOutput.razor:5:53:5:57 | access to property Value | provenance | Sink:MaD:1 | +| BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | provenance | Src:MaD:2 MaD:3 | +| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | BlazorTest/Components/MyOutput.razor:5:53:5:57 | access to property Value | provenance | Sink:MaD:1 | models | 1 | Sink: Microsoft.AspNetCore.Components; MarkupString; false; MarkupString; (System.String); ; Argument[0]; html-injection; manual | | 2 | Source: Microsoft.AspNetCore.Components; SupplyParameterFromQueryAttribute; false; ; ; Attribute.Getter; ReturnValue; remote; manual | @@ -14,5 +14,5 @@ nodes | BlazorTest/Components/Pages/TestPage.razor:11:48:11:55 | access to property UrlParam | semmle.label | access to property UrlParam | | BlazorTest/Components/Pages/TestPage.razor:20:60:20:69 | access to property QueryParam | semmle.label | access to property QueryParam | | BlazorTest/Components/Pages/TestPage.razor:85:23:85:32 | access to property QueryParam : String | semmle.label | access to property QueryParam : String | -| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:569:16:577:13 | call to method TypeCheck : String | semmle.label | call to method TypeCheck : String | +| BlazorTest/obj/Debug/net9.0/generated/Microsoft.CodeAnalysis.Razor.Compiler/Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator/Components_Pages_TestPage_razor.g.cs:553:16:561:13 | call to method TypeCheck : String | semmle.label | call to method TypeCheck : String | subpaths diff --git a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json index 548d37935ed8..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json +++ b/csharp/ql/integration-tests/all-platforms/blazor_build_mode_none/BlazorTest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.300" + "version": "9.0.304" } -} \ No newline at end of file +} diff --git a/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json b/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json +++ b/csharp/ql/integration-tests/all-platforms/conditional_compilation/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml/global.json b/csharp/ql/integration-tests/all-platforms/cshtml/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_disabled/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json +++ b/csharp/ql/integration-tests/all-platforms/cshtml_standalone_flowsteps/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json b/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_dotnet_incompatible/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json b/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_project_files/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_missing_xamarin_sdk/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json +++ b/csharp/ql/integration-tests/all-platforms/diag_recursive_generics/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_build/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_no_args_inject/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_pack/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_publish/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json b/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json +++ b/csharp/ql/integration-tests/all-platforms/dotnet_run/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/source_generator/global.json b/csharp/ql/integration-tests/all-platforms/source_generator/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/source_generator/global.json +++ b/csharp/ql/integration-tests/all-platforms/source_generator/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone/DatabaseQualityDiagnostics.expected b/csharp/ql/integration-tests/all-platforms/standalone/DatabaseQualityDiagnostics.expected index b26e22079462..e9b4f2e24283 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone/DatabaseQualityDiagnostics.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone/DatabaseQualityDiagnostics.expected @@ -1,6 +1,6 @@ diagnosticAttributes -| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityCliSummaryTable | true | -| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityStatusPage | true | -| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityTelemetry | true | +| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityCliSummaryTable | true | +| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityStatusPage | true | +| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityTelemetry | true | #select -| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | 1 | +| Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | Scanning C# code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 25 % (threshold 85 %). Percentage of expressions with known type: 58 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | 1 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone/global.json b/csharp/ql/integration-tests/all-platforms/standalone/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json b/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_buildless_option/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json index 653245229847..4c6e2601f69c 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_dependencies_net48/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json b/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/test.py b/csharp/ql/integration-tests/all-platforms/standalone_resx/test.py index ef1399f4cb28..d799c830dd94 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/test.py +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/test.py @@ -2,5 +2,9 @@ def test(codeql, csharp): + # Making sure the reachability test of `nuget.org` succeeds: + os.environ["CODEQL_EXTRACTOR_CSHARP_BUILDLESS_NUGET_FEEDS_CHECK_FALLBACK_TIMEOUT"] = "1000" + os.environ["CODEQL_EXTRACTOR_CSHARP_BUILDLESS_NUGET_FEEDS_CHECK_FALLBACK_LIMIT"] = "5" + os.environ["CODEQL_EXTRACTOR_CSHARP_BUILDLESS_EXTRACT_RESOURCES"] = "true" codeql.database.create(build_mode="none") diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected index cee8db1f7560..d973f6d8be48 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/Assemblies.expected @@ -1,49 +1,49 @@ -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Design.dll:0:0:0:0 | System.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Design.dll:0:0:0:0 | System.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json b/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/test.py b/csharp/ql/integration-tests/all-platforms/standalone_winforms/test.py index 237174a46c6b..c4f98dd36290 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/test.py +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/test.py @@ -1,2 +1,9 @@ +import os + + def test(codeql, csharp): + # Making sure the reachability test of `nuget.org` succeeds: + os.environ["CODEQL_EXTRACTOR_CSHARP_BUILDLESS_NUGET_FEEDS_CHECK_FALLBACK_TIMEOUT"] = "1000" + os.environ["CODEQL_EXTRACTOR_CSHARP_BUILDLESS_NUGET_FEEDS_CHECK_FALLBACK_LIMIT"] = "5" + codeql.database.create(build_mode="none") diff --git a/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected b/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected index 17e51d0b76fc..cb1f6163d71c 100644 --- a/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected +++ b/csharp/ql/integration-tests/linux/compiler_args/CompilerArgs.expected @@ -9,170 +9,170 @@ | 8 | /define:TRACE;DEBUG;NET;NET9_0;NETCOREAPP;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NET7_0_OR_GREATER;NET8_0_OR_GREATER;NET9_0_OR_GREATER;NETCOREAPP1_0_OR_GREATER;NETCOREAPP1_1_OR_GREATER;NETCOREAPP2_0_OR_GREATER;NETCOREAPP2_1_OR_GREATER;NETCOREAPP2_2_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER | | 9 | /highentropyva+ | | 10 | /nullable:enable | -| 11 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/Microsoft.CSharp.dll | -| 12 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.Core.dll | -| 13 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.dll | -| 14 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/Microsoft.Win32.Primitives.dll | -| 15 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/Microsoft.Win32.Registry.dll | -| 16 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/mscorlib.dll | -| 17 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/netstandard.dll | -| 18 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.AppContext.dll | -| 19 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Buffers.dll | -| 20 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Collections.Concurrent.dll | -| 21 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Collections.dll | -| 22 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Collections.Immutable.dll | -| 23 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Collections.NonGeneric.dll | -| 24 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Collections.Specialized.dll | -| 25 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ComponentModel.Annotations.dll | -| 26 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ComponentModel.DataAnnotations.dll | -| 27 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ComponentModel.dll | -| 28 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ComponentModel.EventBasedAsync.dll | -| 29 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ComponentModel.Primitives.dll | -| 30 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ComponentModel.TypeConverter.dll | -| 31 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Configuration.dll | -| 32 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Console.dll | -| 33 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Core.dll | -| 34 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Data.Common.dll | -| 35 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Data.DataSetExtensions.dll | -| 36 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Data.dll | -| 37 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.Contracts.dll | -| 38 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.Debug.dll | -| 39 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.DiagnosticSource.dll | -| 40 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.FileVersionInfo.dll | -| 41 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.Process.dll | -| 42 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.StackTrace.dll | -| 43 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll | -| 44 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.Tools.dll | -| 45 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.TraceSource.dll | -| 46 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Diagnostics.Tracing.dll | -| 47 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.dll | -| 48 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Drawing.dll | -| 49 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Drawing.Primitives.dll | -| 50 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Dynamic.Runtime.dll | -| 51 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Formats.Asn1.dll | -| 52 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Formats.Tar.dll | -| 53 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Globalization.Calendars.dll | -| 54 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Globalization.dll | -| 55 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Globalization.Extensions.dll | -| 56 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.Compression.Brotli.dll | -| 57 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.Compression.dll | -| 58 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.Compression.FileSystem.dll | -| 59 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.Compression.ZipFile.dll | -| 60 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.dll | -| 61 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.FileSystem.AccessControl.dll | -| 62 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.FileSystem.dll | -| 63 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.FileSystem.DriveInfo.dll | -| 64 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.FileSystem.Primitives.dll | -| 65 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.FileSystem.Watcher.dll | -| 66 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.IsolatedStorage.dll | -| 67 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.MemoryMappedFiles.dll | -| 68 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.Pipelines.dll | -| 69 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.Pipes.AccessControl.dll | -| 70 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.Pipes.dll | -| 71 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.IO.UnmanagedMemoryStream.dll | -| 72 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Linq.dll | -| 73 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Linq.Expressions.dll | -| 74 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Linq.Parallel.dll | -| 75 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Linq.Queryable.dll | -| 76 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Memory.dll | -| 77 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.dll | -| 78 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Http.dll | -| 79 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Http.Json.dll | -| 80 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.HttpListener.dll | -| 81 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Mail.dll | -| 82 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.NameResolution.dll | -| 83 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.NetworkInformation.dll | -| 84 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Ping.dll | -| 85 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Primitives.dll | -| 86 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Quic.dll | -| 87 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Requests.dll | -| 88 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Security.dll | -| 89 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.ServicePoint.dll | -| 90 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.Sockets.dll | -| 91 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.WebClient.dll | -| 92 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.WebHeaderCollection.dll | -| 93 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.WebProxy.dll | -| 94 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.WebSockets.Client.dll | -| 95 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Net.WebSockets.dll | -| 96 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Numerics.dll | -| 97 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Numerics.Vectors.dll | -| 98 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ObjectModel.dll | -| 99 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.DispatchProxy.dll | -| 100 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.dll | -| 101 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.Emit.dll | -| 102 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.Emit.ILGeneration.dll | -| 103 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.Emit.Lightweight.dll | -| 104 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.Extensions.dll | -| 105 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.Metadata.dll | -| 106 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.Primitives.dll | -| 107 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Reflection.TypeExtensions.dll | -| 108 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Resources.Reader.dll | -| 109 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Resources.ResourceManager.dll | -| 110 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Resources.Writer.dll | -| 111 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll | -| 112 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll | -| 113 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.dll | -| 114 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Extensions.dll | -| 115 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Handles.dll | -| 116 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.dll | -| 117 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll | -| 118 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll | -| 119 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Intrinsics.dll | -| 120 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Loader.dll | -| 121 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Numerics.dll | -| 122 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Serialization.dll | -| 123 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Formatters.dll | -| 124 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Json.dll | -| 125 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Primitives.dll | -| 126 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Xml.dll | -| 127 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.AccessControl.dll | -| 128 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Claims.dll | -| 129 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Cryptography.Algorithms.dll | -| 130 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Cryptography.Cng.dll | -| 131 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Cryptography.Csp.dll | -| 132 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Cryptography.dll | -| 133 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Cryptography.Encoding.dll | -| 134 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Cryptography.OpenSsl.dll | -| 135 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Cryptography.Primitives.dll | -| 136 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Cryptography.X509Certificates.dll | -| 137 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.dll | -| 138 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Principal.dll | -| 139 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.Principal.Windows.dll | -| 140 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Security.SecureString.dll | -| 141 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ServiceModel.Web.dll | -| 142 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ServiceProcess.dll | -| 143 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Text.Encoding.CodePages.dll | -| 144 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Text.Encoding.dll | -| 145 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Text.Encoding.Extensions.dll | -| 146 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Text.Encodings.Web.dll | -| 147 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Text.Json.dll | -| 148 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Text.RegularExpressions.dll | -| 149 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.Channels.dll | -| 150 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.dll | -| 151 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.Overlapped.dll | -| 152 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.Tasks.Dataflow.dll | -| 153 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.Tasks.dll | -| 154 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.Tasks.Extensions.dll | -| 155 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.Tasks.Parallel.dll | -| 156 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.Thread.dll | -| 157 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.ThreadPool.dll | -| 158 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Threading.Timer.dll | -| 159 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Transactions.dll | -| 160 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Transactions.Local.dll | -| 161 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.ValueTuple.dll | -| 162 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Web.dll | -| 163 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Web.HttpUtility.dll | -| 164 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Windows.dll | -| 165 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.dll | -| 166 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.Linq.dll | -| 167 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.ReaderWriter.dll | -| 168 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.Serialization.dll | -| 169 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.XDocument.dll | -| 170 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.XmlDocument.dll | -| 171 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.XmlSerializer.dll | -| 172 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.XPath.dll | -| 173 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/System.Xml.XPath.XDocument.dll | -| 174 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/ref/net9.0/WindowsBase.dll | +| 11 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll | +| 12 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll | +| 13 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll | +| 14 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll | +| 15 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll | +| 16 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/mscorlib.dll | +| 17 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/netstandard.dll | +| 18 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.AppContext.dll | +| 19 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Buffers.dll | +| 20 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll | +| 21 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.dll | +| 22 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll | +| 23 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll | +| 24 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll | +| 25 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll | +| 26 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll | +| 27 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.dll | +| 28 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll | +| 29 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll | +| 30 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll | +| 31 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Configuration.dll | +| 32 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Console.dll | +| 33 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Core.dll | +| 34 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Data.Common.dll | +| 35 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll | +| 36 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Data.dll | +| 37 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll | +| 38 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll | +| 39 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll | +| 40 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll | +| 41 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll | +| 42 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll | +| 43 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll | +| 44 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll | +| 45 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll | +| 46 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll | +| 47 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.dll | +| 48 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Drawing.dll | +| 49 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll | +| 50 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll | +| 51 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll | +| 52 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Formats.Tar.dll | +| 53 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll | +| 54 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Globalization.dll | +| 55 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll | +| 56 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll | +| 57 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Compression.dll | +| 58 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll | +| 59 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll | +| 60 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.dll | +| 61 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll | +| 62 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll | +| 63 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll | +| 64 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll | +| 65 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll | +| 66 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll | +| 67 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll | +| 68 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll | +| 69 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll | +| 70 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.Pipes.dll | +| 71 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll | +| 72 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Linq.dll | +| 73 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll | +| 74 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll | +| 75 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll | +| 76 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Memory.dll | +| 77 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.dll | +| 78 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Http.dll | +| 79 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll | +| 80 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll | +| 81 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Mail.dll | +| 82 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll | +| 83 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll | +| 84 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Ping.dll | +| 85 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Primitives.dll | +| 86 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Quic.dll | +| 87 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Requests.dll | +| 88 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Security.dll | +| 89 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll | +| 90 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.Sockets.dll | +| 91 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebClient.dll | +| 92 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll | +| 93 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll | +| 94 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll | +| 95 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll | +| 96 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Numerics.dll | +| 97 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll | +| 98 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ObjectModel.dll | +| 99 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll | +| 100 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.dll | +| 101 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll | +| 102 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll | +| 103 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll | +| 104 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll | +| 105 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll | +| 106 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll | +| 107 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll | +| 108 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Resources.Reader.dll | +| 109 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll | +| 110 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Resources.Writer.dll | +| 111 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll | +| 112 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll | +| 113 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.dll | +| 114 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll | +| 115 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll | +| 116 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll | +| 117 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll | +| 118 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll | +| 119 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll | +| 120 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll | +| 121 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll | +| 122 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll | +| 123 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll | +| 124 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll | +| 125 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll | +| 126 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll | +| 127 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll | +| 128 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Claims.dll | +| 129 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll | +| 130 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll | +| 131 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll | +| 132 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll | +| 133 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll | +| 134 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll | +| 135 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll | +| 136 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll | +| 137 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.dll | +| 138 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Principal.dll | +| 139 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll | +| 140 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Security.SecureString.dll | +| 141 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll | +| 142 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ServiceProcess.dll | +| 143 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll | +| 144 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Encoding.dll | +| 145 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll | +| 146 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll | +| 147 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.Json.dll | +| 148 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll | +| 149 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Channels.dll | +| 150 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.dll | +| 151 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll | +| 152 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll | +| 153 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll | +| 154 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll | +| 155 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll | +| 156 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Thread.dll | +| 157 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll | +| 158 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Threading.Timer.dll | +| 159 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Transactions.dll | +| 160 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Transactions.Local.dll | +| 161 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.ValueTuple.dll | +| 162 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Web.dll | +| 163 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll | +| 164 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Windows.dll | +| 165 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.dll | +| 166 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.Linq.dll | +| 167 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll | +| 168 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll | +| 169 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll | +| 170 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll | +| 171 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll | +| 172 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XPath.dll | +| 173 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll | +| 174 | /reference:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/ref/net9.0/WindowsBase.dll | | 175 | /debug+ | | 176 | /debug:portable | | 177 | /filealign:512 | @@ -185,19 +185,18 @@ | 184 | /utf8output | | 185 | /deterministic+ | | 186 | /langversion:13.0 | -| 187 | /analyzerconfig:/usr/share/dotnet/sdk/9.0.100/Sdks/Microsoft.NET.Sdk/codestyle/cs/build/config/analysislevelstyle_default.globalconfig | -| 188 | /analyzerconfig:obj/Debug/net9.0/test.GeneratedMSBuildEditorConfig.editorconfig | -| 189 | /analyzerconfig:/usr/share/dotnet/sdk/9.0.100/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_9_default.globalconfig | -| 190 | /analyzer:/usr/share/dotnet/sdk/9.0.100/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll | -| 191 | /analyzer:/usr/share/dotnet/sdk/9.0.100/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.NetAnalyzers.dll | -| 192 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/analyzers/dotnet/cs/Microsoft.Interop.ComInterfaceGenerator.dll | -| 193 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/analyzers/dotnet/cs/Microsoft.Interop.JavaScript.JSImportGenerator.dll | -| 194 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/analyzers/dotnet/cs/Microsoft.Interop.LibraryImportGenerator.dll | -| 195 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/analyzers/dotnet/cs/Microsoft.Interop.SourceGeneration.dll | -| 196 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/analyzers/dotnet/cs/System.Text.Json.SourceGeneration.dll | -| 197 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.0/analyzers/dotnet/cs/System.Text.RegularExpressions.Generator.dll | -| 198 | Program.cs | -| 199 | obj/Debug/net9.0/test.GlobalUsings.g.cs | -| 200 | obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | -| 201 | obj/Debug/net9.0/test.AssemblyInfo.cs | -| 202 | /warnaserror+:NU1605,SYSLIB0011 | \ No newline at end of file +| 187 | /analyzerconfig:obj/Debug/net9.0/test.GeneratedMSBuildEditorConfig.editorconfig | +| 188 | /analyzerconfig:/usr/share/dotnet/sdk/9.0.304/Sdks/Microsoft.NET.Sdk/analyzers/build/config/analysislevel_9_default.globalconfig | +| 189 | /analyzer:/usr/share/dotnet/sdk/9.0.304/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll | +| 190 | /analyzer:/usr/share/dotnet/sdk/9.0.304/Sdks/Microsoft.NET.Sdk/targets/../analyzers/Microsoft.CodeAnalysis.NetAnalyzers.dll | +| 191 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/Microsoft.Interop.ComInterfaceGenerator.dll | +| 192 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/Microsoft.Interop.JavaScript.JSImportGenerator.dll | +| 193 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/Microsoft.Interop.LibraryImportGenerator.dll | +| 194 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/Microsoft.Interop.SourceGeneration.dll | +| 195 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/System.Text.Json.SourceGeneration.dll | +| 196 | /analyzer:/usr/share/dotnet/packs/Microsoft.NETCore.App.Ref/9.0.8/analyzers/dotnet/cs/System.Text.RegularExpressions.Generator.dll | +| 197 | Program.cs | +| 198 | obj/Debug/net9.0/test.GlobalUsings.g.cs | +| 199 | obj/Debug/net9.0/.NETCoreApp,Version=v9.0.AssemblyAttributes.cs | +| 200 | obj/Debug/net9.0/test.AssemblyInfo.cs | +| 201 | /warnaserror+:NU1605,SYSLIB0011 | diff --git a/csharp/ql/integration-tests/linux/compiler_args/global.json b/csharp/ql/integration-tests/linux/compiler_args/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/linux/compiler_args/global.json +++ b/csharp/ql/integration-tests/linux/compiler_args/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json b/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json +++ b/csharp/ql/integration-tests/linux/standalone_dependencies_non_utf8_filename/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/dotnet_test/global.json b/csharp/ql/integration-tests/posix/dotnet_test/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/dotnet_test/global.json +++ b/csharp/ql/integration-tests/posix/dotnet_test/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json b/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json +++ b/csharp/ql/integration-tests/posix/dotnet_test_mstest/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/inherit-env-vars/global.json b/csharp/ql/integration-tests/posix/inherit-env-vars/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/inherit-env-vars/global.json +++ b/csharp/ql/integration-tests/posix/inherit-env-vars/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected index 3e9c8fa753b0..05b3826c73cf 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies/Assemblies.expected @@ -1,167 +1,167 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies/global.json index 653245229847..4c6e2601f69c 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected index 3e9c8fa753b0..05b3826c73cf 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/Assemblies.expected @@ -1,167 +1,167 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json index 653245229847..4c6e2601f69c 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_project/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected index eb5ca93485b6..1e4df659dedd 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/Assemblies.expected @@ -1,164 +1,164 @@ -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json index 653245229847..4c6e2601f69c 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_multi_target/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_no_framework/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget with_space/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/Assemblies.expected index 4b2df5c2e329..539f3992b9ed 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/Assemblies.expected @@ -1 +1 @@ -| test-db/working/missingpackages/newtonsoft.json/13.0.3/lib/net6.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | +| test-db/working/missingpackages/newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/proj/proj.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/proj/proj.csproj index b73f743f95c2..e16e4f4b6a64 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/proj/proj.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/proj/proj.csproj @@ -11,6 +11,6 @@ - + diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/test.py b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/test.py index 5aaafca6a46a..42405ca54d4e 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/test.py +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/test.py @@ -1,6 +1,11 @@ +import os import runs_on @runs_on.posix def test(codeql, csharp): + # Making sure the reachability test of `nuget.org` succeeds: + os.environ["CODEQL_EXTRACTOR_CSHARP_BUILDLESS_NUGET_FEEDS_CHECK_FALLBACK_TIMEOUT"] = "1000" + os.environ["CODEQL_EXTRACTOR_CSHARP_BUILDLESS_NUGET_FEEDS_CHECK_FALLBACK_LIMIT"] = "5" + codeql.database.create(build_mode="none") diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/Assemblies.expected index 4b2df5c2e329..539f3992b9ed 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/Assemblies.expected @@ -1 +1 @@ -| test-db/working/missingpackages/newtonsoft.json/13.0.3/lib/net6.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | +| test-db/working/missingpackages/newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/proj/proj.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/proj/proj.csproj index b73f743f95c2..e16e4f4b6a64 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/proj/proj.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/proj/proj.csproj @@ -11,6 +11,6 @@ - + diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/Assemblies.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/Assemblies.expected index 4b2df5c2e329..539f3992b9ed 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/Assemblies.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/Assemblies.expected @@ -1 +1 @@ -| test-db/working/missingpackages/newtonsoft.json/13.0.3/lib/net6.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | +| test-db/working/missingpackages/newtonsoft.json/13.0.4/lib/net6.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/proj/proj.csproj b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/proj/proj.csproj index b73f743f95c2..e16e4f4b6a64 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/proj/proj.csproj +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/proj/proj.csproj @@ -11,6 +11,6 @@ - + diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_no_sources/proj/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_versions/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/posix/warn_as_error/global.json b/csharp/ql/integration-tests/posix/warn_as_error/global.json index 76474f06d044..d488208a2a75 100644 --- a/csharp/ql/integration-tests/posix/warn_as_error/global.json +++ b/csharp/ql/integration-tests/posix/warn_as_error/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected b/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected index a001f7f23d7d..0b4ea613c8e8 100644 --- a/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected +++ b/csharp/ql/integration-tests/windows/standalone_dependencies/Assemblies.expected @@ -1,213 +1,213 @@ | test-db/working/packages/avalara.avatax/23.11.0/lib/netstandard2.0/Avalara.AvaTax.RestClient.dll:0:0:0:0 | Avalara.AvaTax.RestClient, Version=0.0.0.0, Culture=neutral, PublicKeyToken=be94eb8ba37fd33c | | test-db/working/packages/microsoft.bcl.asyncinterfaces/8.0.0/lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll:0:0:0:0 | Microsoft.Bcl.AsyncInterfaces, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.netcore.app.ref/9.0.0/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Design.dll:0:0:0:0 | System.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | -| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.0/ref/net9.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.CSharp.dll:0:0:0:0 | Microsoft.CSharp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Core.dll:0:0:0:0 | Microsoft.VisualBasic.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Primitives.dll:0:0:0:0 | Microsoft.Win32.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.dll:0:0:0:0 | Microsoft.Win32.Registry, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.AppContext.dll:0:0:0:0 | System.AppContext, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Buffers.dll:0:0:0:0 | System.Buffers, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Concurrent.dll:0:0:0:0 | System.Collections.Concurrent, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Immutable.dll:0:0:0:0 | System.Collections.Immutable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.NonGeneric.dll:0:0:0:0 | System.Collections.NonGeneric, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.Specialized.dll:0:0:0:0 | System.Collections.Specialized, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Collections.dll:0:0:0:0 | System.Collections, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Annotations.dll:0:0:0:0 | System.ComponentModel.Annotations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.DataAnnotations.dll:0:0:0:0 | System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.EventBasedAsync.dll:0:0:0:0 | System.ComponentModel.EventBasedAsync, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.Primitives.dll:0:0:0:0 | System.ComponentModel.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.TypeConverter.dll:0:0:0:0 | System.ComponentModel.TypeConverter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ComponentModel.dll:0:0:0:0 | System.ComponentModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Configuration.dll:0:0:0:0 | System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Console.dll:0:0:0:0 | System.Console, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Core.dll:0:0:0:0 | System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.Common.dll:0:0:0:0 | System.Data.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.DataSetExtensions.dll:0:0:0:0 | System.Data.DataSetExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Data.dll:0:0:0:0 | System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Contracts.dll:0:0:0:0 | System.Diagnostics.Contracts, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Debug.dll:0:0:0:0 | System.Diagnostics.Debug, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.DiagnosticSource.dll:0:0:0:0 | System.Diagnostics.DiagnosticSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.FileVersionInfo.dll:0:0:0:0 | System.Diagnostics.FileVersionInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Process.dll:0:0:0:0 | System.Diagnostics.Process, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.StackTrace.dll:0:0:0:0 | System.Diagnostics.StackTrace, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TextWriterTraceListener.dll:0:0:0:0 | System.Diagnostics.TextWriterTraceListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tools.dll:0:0:0:0 | System.Diagnostics.Tools, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.TraceSource.dll:0:0:0:0 | System.Diagnostics.TraceSource, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Diagnostics.Tracing.dll:0:0:0:0 | System.Diagnostics.Tracing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Drawing.Primitives.dll:0:0:0:0 | System.Drawing.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Dynamic.Runtime.dll:0:0:0:0 | System.Dynamic.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Asn1.dll:0:0:0:0 | System.Formats.Asn1, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Formats.Tar.dll:0:0:0:0 | System.Formats.Tar, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Calendars.dll:0:0:0:0 | System.Globalization.Calendars, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.Extensions.dll:0:0:0:0 | System.Globalization.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Globalization.dll:0:0:0:0 | System.Globalization, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.Brotli.dll:0:0:0:0 | System.IO.Compression.Brotli, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.FileSystem.dll:0:0:0:0 | System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.ZipFile.dll:0:0:0:0 | System.IO.Compression.ZipFile, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Compression.dll:0:0:0:0 | System.IO.Compression, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.AccessControl.dll:0:0:0:0 | System.IO.FileSystem.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.DriveInfo.dll:0:0:0:0 | System.IO.FileSystem.DriveInfo, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Primitives.dll:0:0:0:0 | System.IO.FileSystem.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.Watcher.dll:0:0:0:0 | System.IO.FileSystem.Watcher, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.FileSystem.dll:0:0:0:0 | System.IO.FileSystem, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.IsolatedStorage.dll:0:0:0:0 | System.IO.IsolatedStorage, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.MemoryMappedFiles.dll:0:0:0:0 | System.IO.MemoryMappedFiles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipelines.dll:0:0:0:0 | System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.AccessControl.dll:0:0:0:0 | System.IO.Pipes.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.Pipes.dll:0:0:0:0 | System.IO.Pipes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.UnmanagedMemoryStream.dll:0:0:0:0 | System.IO.UnmanagedMemoryStream, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.IO.dll:0:0:0:0 | System.IO, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Expressions.dll:0:0:0:0 | System.Linq.Expressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Parallel.dll:0:0:0:0 | System.Linq.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.Queryable.dll:0:0:0:0 | System.Linq.Queryable, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Linq.dll:0:0:0:0 | System.Linq, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Memory.dll:0:0:0:0 | System.Memory, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.Json.dll:0:0:0:0 | System.Net.Http.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Http.dll:0:0:0:0 | System.Net.Http, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.HttpListener.dll:0:0:0:0 | System.Net.HttpListener, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Mail.dll:0:0:0:0 | System.Net.Mail, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NameResolution.dll:0:0:0:0 | System.Net.NameResolution, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.NetworkInformation.dll:0:0:0:0 | System.Net.NetworkInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Ping.dll:0:0:0:0 | System.Net.Ping, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Primitives.dll:0:0:0:0 | System.Net.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Quic.dll:0:0:0:0 | System.Net.Quic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Requests.dll:0:0:0:0 | System.Net.Requests, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Security.dll:0:0:0:0 | System.Net.Security, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.ServicePoint.dll:0:0:0:0 | System.Net.ServicePoint, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.Sockets.dll:0:0:0:0 | System.Net.Sockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebClient.dll:0:0:0:0 | System.Net.WebClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebHeaderCollection.dll:0:0:0:0 | System.Net.WebHeaderCollection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebProxy.dll:0:0:0:0 | System.Net.WebProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.Client.dll:0:0:0:0 | System.Net.WebSockets.Client, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.WebSockets.dll:0:0:0:0 | System.Net.WebSockets, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Net.dll:0:0:0:0 | System.Net, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.Vectors.dll:0:0:0:0 | System.Numerics.Vectors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Numerics.dll:0:0:0:0 | System.Numerics, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ObjectModel.dll:0:0:0:0 | System.ObjectModel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.DispatchProxy.dll:0:0:0:0 | System.Reflection.DispatchProxy, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.ILGeneration.dll:0:0:0:0 | System.Reflection.Emit.ILGeneration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.Lightweight.dll:0:0:0:0 | System.Reflection.Emit.Lightweight, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Emit.dll:0:0:0:0 | System.Reflection.Emit, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Extensions.dll:0:0:0:0 | System.Reflection.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Metadata.dll:0:0:0:0 | System.Reflection.Metadata, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.Primitives.dll:0:0:0:0 | System.Reflection.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.TypeExtensions.dll:0:0:0:0 | System.Reflection.TypeExtensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Reflection.dll:0:0:0:0 | System.Reflection, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Reader.dll:0:0:0:0 | System.Resources.Reader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.ResourceManager.dll:0:0:0:0 | System.Resources.ResourceManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Resources.Writer.dll:0:0:0:0 | System.Resources.Writer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.Unsafe.dll:0:0:0:0 | System.Runtime.CompilerServices.Unsafe, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.CompilerServices.VisualC.dll:0:0:0:0 | System.Runtime.CompilerServices.VisualC, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Extensions.dll:0:0:0:0 | System.Runtime.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Handles.dll:0:0:0:0 | System.Runtime.Handles, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.JavaScript.dll:0:0:0:0 | System.Runtime.InteropServices.JavaScript, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.RuntimeInformation.dll:0:0:0:0 | System.Runtime.InteropServices.RuntimeInformation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.InteropServices.dll:0:0:0:0 | System.Runtime.InteropServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Intrinsics.dll:0:0:0:0 | System.Runtime.Intrinsics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Loader.dll:0:0:0:0 | System.Runtime.Loader, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Numerics.dll:0:0:0:0 | System.Runtime.Numerics, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Formatters.dll:0:0:0:0 | System.Runtime.Serialization.Formatters, Version=8.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Json.dll:0:0:0:0 | System.Runtime.Serialization.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Primitives.dll:0:0:0:0 | System.Runtime.Serialization.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.Xml.dll:0:0:0:0 | System.Runtime.Serialization.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.Serialization.dll:0:0:0:0 | System.Runtime.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Runtime.dll:0:0:0:0 | System.Runtime, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.AccessControl.dll:0:0:0:0 | System.Security.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Claims.dll:0:0:0:0 | System.Security.Claims, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Algorithms.dll:0:0:0:0 | System.Security.Cryptography.Algorithms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Cng.dll:0:0:0:0 | System.Security.Cryptography.Cng, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Csp.dll:0:0:0:0 | System.Security.Cryptography.Csp, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Encoding.dll:0:0:0:0 | System.Security.Cryptography.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.OpenSsl.dll:0:0:0:0 | System.Security.Cryptography.OpenSsl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Primitives.dll:0:0:0:0 | System.Security.Cryptography.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.X509Certificates.dll:0:0:0:0 | System.Security.Cryptography.X509Certificates, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.dll:0:0:0:0 | System.Security.Cryptography, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.Windows.dll:0:0:0:0 | System.Security.Principal.Windows, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.Principal.dll:0:0:0:0 | System.Security.Principal, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.SecureString.dll:0:0:0:0 | System.Security.SecureString, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Security.dll:0:0:0:0 | System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceModel.Web.dll:0:0:0:0 | System.ServiceModel.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ServiceProcess.dll:0:0:0:0 | System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.CodePages.dll:0:0:0:0 | System.Text.Encoding.CodePages, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.Extensions.dll:0:0:0:0 | System.Text.Encoding.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encoding.dll:0:0:0:0 | System.Text.Encoding, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Encodings.Web.dll:0:0:0:0 | System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.Json.dll:0:0:0:0 | System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Text.RegularExpressions.dll:0:0:0:0 | System.Text.RegularExpressions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Channels.dll:0:0:0:0 | System.Threading.Channels, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Overlapped.dll:0:0:0:0 | System.Threading.Overlapped, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Dataflow.dll:0:0:0:0 | System.Threading.Tasks.Dataflow, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Extensions.dll:0:0:0:0 | System.Threading.Tasks.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.Parallel.dll:0:0:0:0 | System.Threading.Tasks.Parallel, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Tasks.dll:0:0:0:0 | System.Threading.Tasks, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Thread.dll:0:0:0:0 | System.Threading.Thread, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.ThreadPool.dll:0:0:0:0 | System.Threading.ThreadPool, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.Timer.dll:0:0:0:0 | System.Threading.Timer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Threading.dll:0:0:0:0 | System.Threading, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.Local.dll:0:0:0:0 | System.Transactions.Local, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Transactions.dll:0:0:0:0 | System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.ValueTuple.dll:0:0:0:0 | System.ValueTuple, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.HttpUtility.dll:0:0:0:0 | System.Web.HttpUtility, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Web.dll:0:0:0:0 | System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Windows.dll:0:0:0:0 | System.Windows, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Linq.dll:0:0:0:0 | System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.ReaderWriter.dll:0:0:0:0 | System.Xml.ReaderWriter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.Serialization.dll:0:0:0:0 | System.Xml.Serialization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XDocument.dll:0:0:0:0 | System.Xml.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.XDocument.dll:0:0:0:0 | System.Xml.XPath.XDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XPath.dll:0:0:0:0 | System.Xml.XPath, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlDocument.dll:0:0:0:0 | System.Xml.XmlDocument, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.XmlSerializer.dll:0:0:0:0 | System.Xml.XmlSerializer, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.Xml.dll:0:0:0:0 | System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/System.dll:0:0:0:0 | System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/mscorlib.dll:0:0:0:0 | mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.netcore.app.ref/9.0.8/ref/net9.0/netstandard.dll:0:0:0:0 | netstandard, Version=2.1.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Accessibility.dll:0:0:0:0 | Accessibility, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.Forms.dll:0:0:0:0 | Microsoft.VisualBasic.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.VisualBasic.dll:0:0:0:0 | Microsoft.VisualBasic, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.Registry.AccessControl.dll:0:0:0:0 | Microsoft.Win32.Registry.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/Microsoft.Win32.SystemEvents.dll:0:0:0:0 | Microsoft.Win32.SystemEvents, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationCore.dll:0:0:0:0 | PresentationCore, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Aero2.dll:0:0:0:0 | PresentationFramework.Aero2, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Aero.dll:0:0:0:0 | PresentationFramework.Aero, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.AeroLite.dll:0:0:0:0 | PresentationFramework.AeroLite, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Classic.dll:0:0:0:0 | PresentationFramework.Classic, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Luna.dll:0:0:0:0 | PresentationFramework.Luna, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.Royale.dll:0:0:0:0 | PresentationFramework.Royale, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationFramework.dll:0:0:0:0 | PresentationFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/PresentationUI.dll:0:0:0:0 | PresentationUI, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/ReachFramework.dll:0:0:0:0 | ReachFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.CodeDom.dll:0:0:0:0 | System.CodeDom, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Configuration.ConfigurationManager.dll:0:0:0:0 | System.Configuration.ConfigurationManager, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Design.dll:0:0:0:0 | System.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Diagnostics.EventLog.dll:0:0:0:0 | System.Diagnostics.EventLog, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Diagnostics.PerformanceCounter.dll:0:0:0:0 | System.Diagnostics.PerformanceCounter, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.DirectoryServices.dll:0:0:0:0 | System.DirectoryServices, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.Common.dll:0:0:0:0 | System.Drawing.Common, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.Design.dll:0:0:0:0 | System.Drawing.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Drawing.dll:0:0:0:0 | System.Drawing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Formats.Nrbf.dll:0:0:0:0 | System.Formats.Nrbf, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.IO.Packaging.dll:0:0:0:0 | System.IO.Packaging, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Printing.dll:0:0:0:0 | System.Printing, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Private.Windows.Core.dll:0:0:0:0 | System.Private.Windows.Core, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Resources.Extensions.dll:0:0:0:0 | System.Resources.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Pkcs.dll:0:0:0:0 | System.Security.Cryptography.Pkcs, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.ProtectedData.dll:0:0:0:0 | System.Security.Cryptography.ProtectedData, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Cryptography.Xml.dll:0:0:0:0 | System.Security.Cryptography.Xml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Security.Permissions.dll:0:0:0:0 | System.Security.Permissions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Threading.AccessControl.dll:0:0:0:0 | System.Threading.AccessControl, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Controls.Ribbon.dll:0:0:0:0 | System.Windows.Controls.Ribbon, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Extensions.dll:0:0:0:0 | System.Windows.Extensions, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Design.Editors.dll:0:0:0:0 | System.Windows.Forms.Design.Editors, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Design.dll:0:0:0:0 | System.Windows.Forms.Design, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.Primitives.dll:0:0:0:0 | System.Windows.Forms.Primitives, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Forms.dll:0:0:0:0 | System.Windows.Forms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Input.Manipulations.dll:0:0:0:0 | System.Windows.Input.Manipulations, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Windows.Presentation.dll:0:0:0:0 | System.Windows.Presentation, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/System.Xaml.dll:0:0:0:0 | System.Xaml, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationClient.dll:0:0:0:0 | UIAutomationClient, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationClientSideProviders.dll:0:0:0:0 | UIAutomationClientSideProviders, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationProvider.dll:0:0:0:0 | UIAutomationProvider, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/UIAutomationTypes.dll:0:0:0:0 | UIAutomationTypes, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/WindowsBase.dll:0:0:0:0 | WindowsBase, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | +| test-db/working/packages/microsoft.windowsdesktop.app.ref/9.0.8/ref/net9.0/WindowsFormsIntegration.dll:0:0:0:0 | WindowsFormsIntegration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 | | test-db/working/packages/newtonsoft.json/12.0.1/lib/netstandard2.0/Newtonsoft.Json.dll:0:0:0:0 | Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed | diff --git a/csharp/ql/integration-tests/windows/standalone_dependencies/global.json b/csharp/ql/integration-tests/windows/standalone_dependencies/global.json index 653245229847..4c6e2601f69c 100644 --- a/csharp/ql/integration-tests/windows/standalone_dependencies/global.json +++ b/csharp/ql/integration-tests/windows/standalone_dependencies/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "9.0.100" + "version": "9.0.304" } } diff --git a/csharp/ql/lib/CHANGELOG.md b/csharp/ql/lib/CHANGELOG.md index 0aca82e83107..cb639225e7d2 100644 --- a/csharp/ql/lib/CHANGELOG.md +++ b/csharp/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.2.4 + +No user-facing changes. + ## 5.2.3 ### Minor Analysis Improvements diff --git a/csharp/ql/lib/change-notes/released/5.2.4.md b/csharp/ql/lib/change-notes/released/5.2.4.md new file mode 100644 index 000000000000..18f54ba122db --- /dev/null +++ b/csharp/ql/lib/change-notes/released/5.2.4.md @@ -0,0 +1,3 @@ +## 5.2.4 + +No user-facing changes. diff --git a/csharp/ql/lib/codeql-pack.release.yml b/csharp/ql/lib/codeql-pack.release.yml index f7fd1ec5b57a..fc4dc64578b7 100644 --- a/csharp/ql/lib/codeql-pack.release.yml +++ b/csharp/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.2.3 +lastReleaseVersion: 5.2.4 diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index 2ecc1490cf54..4bc94c6c6d0d 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 5.2.3 +version: 5.2.4 groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/lib/semmle/code/csharp/Caching.qll b/csharp/ql/lib/semmle/code/csharp/Caching.qll index 6a58edef63ff..4e34f5504dc9 100644 --- a/csharp/ql/lib/semmle/code/csharp/Caching.qll +++ b/csharp/ql/lib/semmle/code/csharp/Caching.qll @@ -10,7 +10,6 @@ module Stages { cached module ControlFlowStage { private import semmle.code.csharp.controlflow.internal.Splitting - private import semmle.code.csharp.controlflow.internal.SuccessorType private import semmle.code.csharp.controlflow.Guards as Guards cached @@ -20,8 +19,6 @@ module Stages { private predicate forceCachingInSameStageRev() { exists(Split s) or - exists(SuccessorType st) - or exists(ControlFlow::Node n) or Guards::Internal::isCustomNullCheck(_, _, _, _) diff --git a/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll index 508ba0e5e87d..ab2d9e0eef74 100644 --- a/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll +++ b/csharp/ql/lib/semmle/code/csharp/commons/Constants.qll @@ -6,9 +6,7 @@ private import semmle.code.csharp.commons.StructuralComparison as StructuralComp pragma[noinline] private predicate isConstantCondition0(ControlFlow::Node cfn, boolean b) { - exists( - cfn.getASuccessorByType(any(ControlFlow::SuccessorTypes::BooleanSuccessor t | t.getValue() = b)) - ) and + exists(cfn.getASuccessorByType(any(ControlFlow::BooleanSuccessor t | t.getValue() = b))) and strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessorByType(t))) = 1 } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll index c3bf2545230c..bf6a97728574 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll @@ -3,7 +3,7 @@ */ import csharp -private import ControlFlow::SuccessorTypes +private import ControlFlow private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as CfgImpl private import CfgImpl::BasicBlocks as BasicBlocksImpl private import codeql.controlflow.BasicBlock as BB @@ -346,8 +346,6 @@ private class EntryBasicBlockAlias = EntryBasicBlock; module Cfg implements BB::CfgSig { class ControlFlowNode = ControlFlow::Node; - class SuccessorType = ControlFlow::SuccessorType; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock = EntryBasicBlockAlias; diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll index 1cd09725b6e0..f914b13e228e 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowElement.qll @@ -5,7 +5,6 @@ private import semmle.code.csharp.ExprOrStmtParent private import semmle.code.csharp.commons.Compilation private import ControlFlow private import ControlFlow::BasicBlocks -private import SuccessorTypes private import semmle.code.csharp.Caching private import internal.ControlFlowGraphImpl as Impl diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll index 2334d240935f..4b9d636824cc 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll @@ -6,7 +6,6 @@ import csharp module ControlFlow { private import semmle.code.csharp.controlflow.BasicBlocks as BBs import semmle.code.csharp.controlflow.internal.SuccessorType - private import SuccessorTypes private import internal.ControlFlowGraphImpl as Impl private import internal.Splitting as Splitting diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll index 2688472f71c3..82ab4b638126 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/Guards.qll @@ -3,7 +3,7 @@ */ import csharp -private import ControlFlow::SuccessorTypes +private import ControlFlow private import semmle.code.csharp.commons.Assertions private import semmle.code.csharp.commons.ComparisonTest private import semmle.code.csharp.commons.StructuralComparison as SC @@ -1424,6 +1424,7 @@ module Internal { cached predicate isGuard(Expr e, AbstractValue val) { + Stages::ControlFlowStage::forceCachingInSameStage() and ( e.getType() instanceof BoolType and not e instanceof BoolLiteral and 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 a3bf97945964..b1afbaed8ef0 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Completion.qll @@ -26,7 +26,6 @@ private import semmle.code.csharp.frameworks.System private import ControlFlowGraphImpl private import NonReturning private import SuccessorType -private import SuccessorTypes private newtype TCompletion = TSimpleCompletion() or @@ -573,7 +572,7 @@ abstract private class NonNestedNormalCompletion extends NormalCompletion { } /** A simple (normal) completion. */ class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } override string toString() { result = "normal" } } @@ -857,7 +856,7 @@ class GotoCompletion extends Completion { /** Gets the label of the `goto` completion. */ string getLabel() { result = label } - override GotoSuccessor getAMatchingSuccessorType() { result.getLabel() = label } + override GotoSuccessor getAMatchingSuccessorType() { any() } override string toString() { // `NestedCompletion` defines `toString()` for the other case @@ -880,7 +879,7 @@ class ThrowCompletion extends Completion { /** Gets the type of the exception being thrown. */ ExceptionClass getExceptionClass() { result = ec } - override ExceptionSuccessor getAMatchingSuccessorType() { result.getExceptionClass() = ec } + override ExceptionSuccessor getAMatchingSuccessorType() { any() } override string toString() { // `NestedCompletion` defines `toString()` for the other case diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll index 74cb070635b2..5f62d6d21df1 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll @@ -79,23 +79,10 @@ private module CfgInput implements CfgShared::InputSig { Impl::scopeLast(scope, last, c) } - class SuccessorType = ST::SuccessorType; + private class SuccessorType = ST::SuccessorType; SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate successorTypeIsSimple(SuccessorType t) { - t instanceof ST::SuccessorTypes::NormalSuccessor - } - - predicate successorTypeIsCondition(SuccessorType t) { - t instanceof ST::SuccessorTypes::ConditionalSuccessor - } - - predicate isAbnormalExitType(SuccessorType t) { - t instanceof ST::SuccessorTypes::ExceptionSuccessor or - t instanceof ST::SuccessorTypes::ExitSuccessor - } - int idOfAstNode(AstNode node) { result = node.getId() } int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) } 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 b3cdf3335e66..38eca378edf2 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll @@ -150,7 +150,7 @@ class ConditionBlock extends PreBasicBlock { } pragma[nomagic] - predicate controls(PreBasicBlock controlled, Cfg::SuccessorTypes::ConditionalSuccessor s) { + predicate controls(PreBasicBlock controlled, Cfg::ConditionalSuccessor s) { exists(PreBasicBlock succ, ConditionalCompletion c | conditionBlockImmediatelyControls(this, succ, c) | @@ -163,8 +163,6 @@ class ConditionBlock extends PreBasicBlock { module PreCfg implements BB::CfgSig { class ControlFlowNode = ControlFlowElement; - class SuccessorType = Cfg::SuccessorType; - class BasicBlock = PreBasicBlock; class EntryBasicBlock extends BasicBlock { 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 ce9fdd406fd8..4921e6926232 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreSsa.qll @@ -82,6 +82,8 @@ module PreSsa { } module SsaInput implements SsaImplCommon::InputSig { + private import semmle.code.csharp.Caching + private class ExitBasicBlock extends PreBasicBlocks::PreBasicBlock { ExitBasicBlock() { scopeLast(_, this.getLastNode(), _) } } @@ -124,6 +126,7 @@ module PreSsa { predicate variableWrite( PreBasicBlocks::PreBasicBlock bb, int i, SourceVariable v, boolean certain ) { + Stages::ControlFlowStage::forceCachingInSameStage() and exists(AssignableDefinition def | definitionAt(def, bb, i, v) and if def.getTargetAccess().isRefArgument() then certain = false else certain = true diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll index f57dd0703fce..bcc4c48ec924 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/Splitting.qll @@ -471,7 +471,7 @@ module FinallySplitting { * the `finally` block exits normally). */ class FinallySplitType extends Cfg::SuccessorType { - FinallySplitType() { not this instanceof Cfg::SuccessorTypes::ConditionalSuccessor } + FinallySplitType() { not this instanceof Cfg::ConditionalSuccessor } /** Holds if this split type matches entry into a `finally` block with completion `c`. */ predicate isSplitForEntryCompletion(Completion c) { @@ -479,7 +479,7 @@ module FinallySplitting { then // If the entry into the `finally` block completes with any normal completion, // it simply means normal execution after the `finally` block - this instanceof Cfg::SuccessorTypes::NormalSuccessor + this instanceof Cfg::DirectSuccessor else this = c.getAMatchingSuccessorType() } } @@ -533,7 +533,7 @@ module FinallySplitting { int getNestLevel() { result = nestLevel } override string toString() { - if type instanceof Cfg::SuccessorTypes::NormalSuccessor + if type instanceof Cfg::DirectSuccessor then result = "" else if nestLevel > 0 @@ -617,14 +617,14 @@ module FinallySplitting { or not c instanceof NormalCompletion or - type instanceof Cfg::SuccessorTypes::NormalSuccessor + type instanceof Cfg::DirectSuccessor ) else ( // Finally block can exit with completion `c` inherited from try/catch // block: must match this split inherited = true and type = c.getAMatchingSuccessorType() and - not type instanceof Cfg::SuccessorTypes::NormalSuccessor + not type instanceof Cfg::DirectSuccessor ) ) or @@ -657,7 +657,7 @@ module FinallySplitting { exists(FinallySplit outer | outer.getNestLevel() = super.getNestLevel() - 1 and outer.(FinallySplitImpl).exit(pred, c, inherited) and - super.getType() instanceof Cfg::SuccessorTypes::NormalSuccessor and + super.getType() instanceof Cfg::DirectSuccessor and inherited = true ) } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll index d6ea2161bbb7..c0dae26b30e0 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/SuccessorType.qll @@ -4,329 +4,4 @@ * Provides different types of control flow successor types. */ -import csharp -private import Completion -private import semmle.code.csharp.Caching - -cached -private newtype TSuccessorType = - TSuccessorSuccessor() { Stages::ControlFlowStage::forceCachingInSameStage() } or - TBooleanSuccessor(boolean b) { b = true or b = false } or - TNullnessSuccessor(boolean isNull) { isNull = true or isNull = false } or - TMatchingSuccessor(boolean isMatch) { isMatch = true or isMatch = false } or - TEmptinessSuccessor(boolean isEmpty) { isEmpty = true or isEmpty = false } or - TReturnSuccessor() or - TBreakSuccessor() or - TContinueSuccessor() or - TGotoSuccessor(string label) { label = any(GotoStmt gs).getLabel() } or - TExceptionSuccessor(ExceptionClass ec) { exists(ThrowCompletion c | c.getExceptionClass() = ec) } or - TExitSuccessor() - -/** The type of a control flow successor. */ -class SuccessorType extends TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { none() } -} - -/** Provides different types of control flow successor types. */ -module SuccessorTypes { - /** A normal control flow successor. */ - class NormalSuccessor extends SuccessorType, TSuccessorSuccessor { - override string toString() { result = "successor" } - } - - /** - * A conditional control flow successor. Either a Boolean successor (`BooleanSuccessor`), - * a nullness successor (`NullnessSuccessor`), a matching successor (`MatchingSuccessor`), - * or an emptiness successor (`EmptinessSuccessor`). - */ - abstract class ConditionalSuccessor extends SuccessorType { - /** Gets the Boolean value of this successor. */ - abstract boolean getValue(); - } - - /** - * A Boolean control flow successor. - * - * For example, this program fragment: - * - * ```csharp - * if (x < 0) - * return 0; - * else - * return 1; - * ``` - * - * has a control flow graph containing Boolean successors: - * - * ``` - * if - * | - * x < 0 - * / \ - * / \ - * / \ - * true false - * | \ - * return 0 return 1 - * ``` - */ - class BooleanSuccessor extends ConditionalSuccessor, TBooleanSuccessor { - override boolean getValue() { this = TBooleanSuccessor(result) } - - override string toString() { result = this.getValue().toString() } - } - - /** - * A nullness control flow successor. - * - * For example, this program fragment: - * - * ```csharp - * int? M(string s) => s?.Length; - * ``` - * - * has a control flow graph containing nullness successors: - * - * ``` - * enter M - * | - * s - * / \ - * / \ - * / \ - * null non-null - * \ | - * \ Length - * \ / - * \ / - * exit M - * ``` - */ - class NullnessSuccessor extends ConditionalSuccessor, TNullnessSuccessor { - /** Holds if this is a `null` successor. */ - predicate isNull() { this = TNullnessSuccessor(true) } - - override boolean getValue() { this = TNullnessSuccessor(result) } - - override string toString() { if this.isNull() then result = "null" else result = "non-null" } - } - - /** - * A matching control flow successor. - * - * For example, this program fragment: - * - * ```csharp - * switch (x) { - * case 0 : - * return 0; - * default : - * return 1; - * } - * ``` - * - * has a control flow graph containing matching successors: - * - * ``` - * switch - * | - * x - * | - * case 0 - * / \ - * / \ - * / \ - * match no-match - * | \ - * return 0 default - * | - * return 1 - * ``` - */ - class MatchingSuccessor extends ConditionalSuccessor, TMatchingSuccessor { - /** Holds if this is a match successor. */ - predicate isMatch() { this = TMatchingSuccessor(true) } - - override boolean getValue() { this = TMatchingSuccessor(result) } - - override string toString() { if this.isMatch() then result = "match" else result = "no-match" } - } - - /** - * An emptiness control flow successor. - * - * For example, this program fragment: - * - * ```csharp - * foreach (var arg in args) - * { - * yield return arg; - * } - * yield return ""; - * ``` - * - * has a control flow graph containing emptiness successors: - * - * ``` - * args - * | - * foreach------<------- - * / \ \ - * / \ | - * / \ | - * / \ | - * empty non-empty | - * | \ | - * yield return "" \ | - * var arg | - * | | - * yield return arg | - * \_________/ - * ``` - */ - class EmptinessSuccessor extends ConditionalSuccessor, TEmptinessSuccessor { - /** Holds if this is an empty successor. */ - predicate isEmpty() { this = TEmptinessSuccessor(true) } - - override boolean getValue() { this = TEmptinessSuccessor(result) } - - override string toString() { if this.isEmpty() then result = "empty" else result = "non-empty" } - } - - /** - * A `return` control flow successor. - * - * Example: - * - * ```csharp - * void M() - * { - * return; - * } - * ``` - * - * The callable exit node of `M` is a `return` successor of the `return;` - * statement. - */ - class ReturnSuccessor extends SuccessorType, TReturnSuccessor { - override string toString() { result = "return" } - } - - /** - * A `break` control flow successor. - * - * Example: - * - * ```csharp - * int M(int x) - * { - * while (true) - * { - * if (x++ > 10) - * break; - * } - * return x; - * } - * ``` - * - * The node `return x;` is a `break` successor of the node `break;`. - */ - class BreakSuccessor extends SuccessorType, TBreakSuccessor { - override string toString() { result = "break" } - } - - /** - * A `continue` control flow successor. - * - * Example: - * - * ```csharp - * int M(int x) - * { - * while (true) { - * if (x++ < 10) - * continue; - * } - * return x; - * } - * ``` - * - * The node `while (true) { ... }` is a `continue` successor of the node - * `continue;`. - */ - class ContinueSuccessor extends SuccessorType, TContinueSuccessor { - override string toString() { result = "continue" } - } - - /** - * A `goto` control flow successor. - * - * Example: - * - * ```csharp - * int M(int x) - * { - * while (true) - * { - * if (x++ > 10) - * goto Return; - * } - * Return: return x; - * } - * ``` - * - * The node `Return: return x` is a `goto label` successor of the node - * `goto Return;`. - */ - class GotoSuccessor extends SuccessorType, TGotoSuccessor { - /** Gets the `goto` label. */ - string getLabel() { this = TGotoSuccessor(result) } - - override string toString() { result = "goto(" + this.getLabel() + ")" } - } - - /** - * An exceptional control flow successor. - * - * Example: - * - * ```csharp - * int M(string s) - * { - * if (s == null) - * throw new ArgumentNullException(nameof(s)); - * return s.Length; - * } - * ``` - * - * The callable exit node of `M` is an exceptional successor (of type - * `ArgumentNullException`) of the node `throw new ArgumentNullException(nameof(s));`. - */ - class ExceptionSuccessor extends SuccessorType, TExceptionSuccessor { - /** Gets the type of exception. */ - ExceptionClass getExceptionClass() { this = TExceptionSuccessor(result) } - - override string toString() { result = "exception(" + this.getExceptionClass().getName() + ")" } - } - - /** - * An exit control flow successor. - * - * Example: - * - * ```csharp - * int M(string s) - * { - * if (s == null) - * System.Environment.Exit(0); - * return s.Length; - * } - * ``` - * - * The callable exit node of `M` is an exit successor of the node on line 4. - */ - class ExitSuccessor extends SuccessorType, TExitSuccessor { - override string toString() { result = "exit" } - } -} +import codeql.controlflow.SuccessorType diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll index 352418779955..3723dcaec12a 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/Nullness.qll @@ -151,9 +151,7 @@ private predicate exprImpliesSsaDef( * If the returned element takes the `s` branch, then `def` is guaranteed to be * `null` if `nv.isNull()` holds, and non-`null` otherwise. */ -private ControlFlowElement getANullCheck( - Ssa::Definition def, SuccessorTypes::ConditionalSuccessor s, NullValue nv -) { +private ControlFlowElement getANullCheck(Ssa::Definition def, ConditionalSuccessor s, NullValue nv) { exists(Expr e, G::AbstractValue v | v.branch(result, s, e) | exprImpliesSsaDef(e, v, def, nv)) } @@ -294,7 +292,7 @@ private predicate defNullImpliesStep( bb2 = phi.getBasicBlock() ) ) and - not exists(SuccessorTypes::ConditionalSuccessor s, NullValue nv | + not exists(ConditionalSuccessor s, NullValue nv | bb1.getLastNode() = getANullCheck(def1, s, nv).getAControlFlowNode() | bb2 = bb1.getASuccessor(s) and 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 6e2d7d239f78..747cf790d91f 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/BaseSSA.qll @@ -28,7 +28,7 @@ module BaseSsa { private predicate implicitEntryDef( Callable c, ControlFlow::BasicBlocks::EntryBlock bb, SsaInput::SourceVariable v ) { - exists(ControlFlow::ControlFlow::BasicBlocks::EntryBlock entry | + exists(ControlFlow::BasicBlocks::EntryBlock entry | c = entry.getCallable() and // In case `c` has multiple bodies, we want each body to get its own implicit // entry definition. In case `c` doesn't have multiple bodies, the line below 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 f9563ef9fe5d..19e4f3748160 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowPrivate.qll @@ -2592,9 +2592,7 @@ class NodeRegion instanceof ControlFlow::BasicBlock { * Holds if the nodes in `nr` are unreachable when the call context is `call`. */ predicate isUnreachableInCall(NodeRegion nr, DataFlowCall call) { - exists( - ExplicitParameterNode paramNode, Guard guard, ControlFlow::SuccessorTypes::BooleanSuccessor bs - | + exists(ExplicitParameterNode paramNode, Guard guard, ControlFlow::BooleanSuccessor bs | viableConstantBooleanParamArg(paramNode, bs.getValue().booleanNot(), call) and paramNode.getSsaDefinition().getARead() = guard and guard.controlsBlock(nr, bs, _) 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 d3f1a9d956bb..1b703d70dbdc 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/SsaImpl.qll @@ -818,8 +818,8 @@ private module Cached { } cached - predicate implicitEntryDefinition(ControlFlow::ControlFlow::BasicBlock bb, Ssa::SourceVariable v) { - exists(ControlFlow::ControlFlow::BasicBlocks::EntryBlock entry, Callable c | + predicate implicitEntryDefinition(ControlFlow::BasicBlock bb, Ssa::SourceVariable v) { + exists(ControlFlow::BasicBlocks::EntryBlock entry, Callable c | c = entry.getCallable() and // In case `c` has multiple bodies, we want each body to get its own implicit // entry definition. In case `c` doesn't have multiple bodies, the line below @@ -1045,7 +1045,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu * from `bb1` to `bb2`. */ predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { - exists(ControlFlow::SuccessorTypes::ConditionalSuccessor s | + exists(ControlFlow::ConditionalSuccessor s | this.getAControlFlowNode() = bb1.getLastNode() and bb2 = bb1.getASuccessor(s) and s.getValue() = branch @@ -1064,7 +1064,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ predicate guardDirectlyControlsBlock(Guard guard, ControlFlow::BasicBlock bb, GuardValue branch) { - exists(ConditionBlock conditionBlock, ControlFlow::SuccessorTypes::ConditionalSuccessor s | + exists(ConditionBlock conditionBlock, ControlFlow::ConditionalSuccessor s | guard.getAControlFlowNode() = conditionBlock.getLastNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll index ee345780654d..f2b46e4ebac1 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/ConditionalBypassQuery.qll @@ -74,7 +74,7 @@ class ReverseDnsSource extends Source { pragma[noinline] private predicate conditionControlsCall0( - SensitiveExecutionMethodCall call, Expr e, ControlFlow::SuccessorTypes::BooleanSuccessor s + SensitiveExecutionMethodCall call, Expr e, ControlFlow::BooleanSuccessor s ) { forex(BasicBlock bb | bb = call.getAControlFlowNode().getBasicBlock() | e.controlsBlock(bb, s, _)) } @@ -82,9 +82,7 @@ private predicate conditionControlsCall0( private predicate conditionControlsCall( SensitiveExecutionMethodCall call, SensitiveExecutionMethod def, Expr e, boolean cond ) { - exists(ControlFlow::SuccessorTypes::BooleanSuccessor s | cond = s.getValue() | - conditionControlsCall0(call, e, s) - ) and + exists(ControlFlow::BooleanSuccessor s | cond = s.getValue() | conditionControlsCall0(call, e, s)) and def = call.getTarget().getUnboundDeclaration() } diff --git a/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql b/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql index 5ec702f77e04..eb71239e0fc0 100644 --- a/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql +++ b/csharp/ql/src/Bad Practices/Control-Flow/ConstantCondition.ql @@ -89,7 +89,7 @@ class ConstantNullnessCondition extends ConstantCondition { ConstantNullnessCondition() { forex(ControlFlow::Node cfn | cfn = this.getAControlFlowNode() | - exists(ControlFlow::SuccessorTypes::NullnessSuccessor t, ControlFlow::Node s | + exists(ControlFlow::NullnessSuccessor t, ControlFlow::Node s | s = cfn.getASuccessorByType(t) | b = t.getValue() and @@ -112,7 +112,7 @@ class ConstantMatchingCondition extends ConstantCondition { ConstantMatchingCondition() { forex(ControlFlow::Node cfn | cfn = this.getAControlFlowNode() | - exists(ControlFlow::SuccessorTypes::MatchingSuccessor t | exists(cfn.getASuccessorByType(t)) | + exists(ControlFlow::MatchingSuccessor t | exists(cfn.getASuccessorByType(t)) | b = t.getValue() ) and strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessorByType(t))) = 1 diff --git a/csharp/ql/src/CHANGELOG.md b/csharp/ql/src/CHANGELOG.md index e1109181fca3..e044a3dbb4f7 100644 --- a/csharp/ql/src/CHANGELOG.md +++ b/csharp/ql/src/CHANGELOG.md @@ -1,3 +1,17 @@ +## 1.4.0 + +### Deprecated Queries + +* The query `cs/captured-foreach-variable` has been deprecated as the semantics of capturing a 'foreach' variable and using it outside the loop has been stable since C# version 5. + +### Minor Analysis Improvements + +* The query `cs/call-to-object-tostring` has been improved to remove false positives for enum types. + +### Bug Fixes + +* The message for `csharp/diagnostic/database-quality` has been updated to include detailed database health metrics. Additionally, the threshold for reporting database health issues has been lowered from 95% to 85% (if any metric falls below this percentage). These changes are visible on the tool status page. + ## 1.3.4 No user-facing changes. diff --git a/csharp/ql/src/Language Abuse/ForeachCapture.ql b/csharp/ql/src/Language Abuse/ForeachCapture.ql index 0148796a2e72..2f8346817a6f 100644 --- a/csharp/ql/src/Language Abuse/ForeachCapture.ql +++ b/csharp/ql/src/Language Abuse/ForeachCapture.ql @@ -1,4 +1,6 @@ /** + * @deprecated This query is no longer relevant as the semantics of capturing a 'foreach' variable + * and using it outside the loop has been stable since C# version 5. * @name Capturing a foreach variable * @description Code that captures a 'foreach' variable and uses it outside the loop behaves differently in C# version 4 and C# version 5 * @kind problem diff --git a/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.qhelp b/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.qhelp index 7483af84a1f5..ae50a05b18ac 100644 --- a/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.qhelp +++ b/csharp/ql/src/Likely Bugs/LeapYear/UnsafeYearConstruction.qhelp @@ -12,7 +12,7 @@

In this example, we are incrementing/decrementing the current date by one year when creating a new System.DateTime object. This may work most of the time, but on any given February 29th, the resulting value will be invalid.

-

To fix this bug, we add/substract years to the current date by calling AddYears method on it.

+

To fix this bug, we add/subtract years to the current date by calling AddYears method on it.

diff --git a/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql b/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql index 5258d6a4cd2a..c350c8f37554 100644 --- a/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql +++ b/csharp/ql/src/Security Features/CWE-384/AbandonSession.ql @@ -21,10 +21,10 @@ predicate loginMethod(Method m, ControlFlow::SuccessorType flowFrom) { or m = any(SystemWebSecurityFormsAuthenticationClass c).getAuthenticateMethod() ) and - flowFrom.(ControlFlow::SuccessorTypes::BooleanSuccessor).getValue() = true + flowFrom.(ControlFlow::BooleanSuccessor).getValue() = true or m = any(SystemWebSecurityFormsAuthenticationClass c).getSignOutMethod() and - flowFrom instanceof ControlFlow::SuccessorTypes::NormalSuccessor + flowFrom instanceof ControlFlow::DirectSuccessor } /** The `System.Web.SessionState.HttpSessionState` class. */ diff --git a/csharp/ql/src/Telemetry/DatabaseQualityDiagnostics.ql b/csharp/ql/src/Telemetry/DatabaseQualityDiagnostics.ql index bde07633d941..207a25081a20 100644 --- a/csharp/ql/src/Telemetry/DatabaseQualityDiagnostics.ql +++ b/csharp/ql/src/Telemetry/DatabaseQualityDiagnostics.ql @@ -8,26 +8,39 @@ import csharp import DatabaseQuality +private predicate diagnostic(string msg, float value, float threshold) { + CallTargetStatsReport::percentageOfOk(msg, value) and + threshold = 85 + or + ExprTypeStatsReport::percentageOfOk(msg, value) and + threshold = 85 +} + private newtype TDbQualityDiagnostic = TTheDbQualityDiagnostic() { - exists(float percentageGood | - CallTargetStatsReport::percentageOfOk(_, percentageGood) - or - ExprTypeStatsReport::percentageOfOk(_, percentageGood) - | - percentageGood < 95 + exists(float percentageGood, float threshold | + diagnostic(_, percentageGood, threshold) and + percentageGood < threshold ) } +private string getDbHealth() { + result = + strictconcat(string msg, float value, float threshold | + diagnostic(msg, value, threshold) + | + msg + ": " + value.floor() + " % (threshold " + threshold.floor() + " %)", ". " + ) +} + class DbQualityDiagnostic extends TDbQualityDiagnostic { string toString() { result = "Scanning C# code completed successfully, but the scan encountered issues. " + - "This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- " - + - "see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. " - + - "Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning C# " + "This may be caused by problems identifying dependencies or use of generated source code. " + + "Some metrics of the database quality are: " + getDbHealth() + ". " + + "Ideally these metrics should be above their thresholds. " + + "Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning C# " + "using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes)." } diff --git a/csharp/ql/src/Useless code/DefaultToStringQuery.qll b/csharp/ql/src/Useless code/DefaultToStringQuery.qll index f11b5a9cd324..411ca47b5e67 100644 --- a/csharp/ql/src/Useless code/DefaultToStringQuery.qll +++ b/csharp/ql/src/Useless code/DefaultToStringQuery.qll @@ -47,6 +47,7 @@ private predicate alwaysInvokesToString(ParameterRead pr) { */ predicate alwaysDefaultToString(ValueOrRefType t) { not t instanceof TupleType and + not t instanceof Enum and exists(ToStringMethod m | t.hasMethod(m) | m.getDeclaringType() instanceof SystemObjectClass or m.getDeclaringType() instanceof SystemValueTypeClass diff --git a/csharp/ql/src/change-notes/released/1.4.0.md b/csharp/ql/src/change-notes/released/1.4.0.md new file mode 100644 index 000000000000..43d887f928ae --- /dev/null +++ b/csharp/ql/src/change-notes/released/1.4.0.md @@ -0,0 +1,13 @@ +## 1.4.0 + +### Deprecated Queries + +* The query `cs/captured-foreach-variable` has been deprecated as the semantics of capturing a 'foreach' variable and using it outside the loop has been stable since C# version 5. + +### Minor Analysis Improvements + +* The query `cs/call-to-object-tostring` has been improved to remove false positives for enum types. + +### Bug Fixes + +* The message for `csharp/diagnostic/database-quality` has been updated to include detailed database health metrics. Additionally, the threshold for reporting database health issues has been lowered from 95% to 85% (if any metric falls below this percentage). These changes are visible on the tool status page. diff --git a/csharp/ql/src/codeql-pack.release.yml b/csharp/ql/src/codeql-pack.release.yml index 8263ddf2c8b8..b8b2e97d5086 100644 --- a/csharp/ql/src/codeql-pack.release.yml +++ b/csharp/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.3.4 +lastReleaseVersion: 1.4.0 diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 4acd0357d7e6..88dd741a89d0 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.3.4 +version: 1.4.0 groups: - csharp - queries diff --git a/csharp/ql/test/library-tests/assignables/AssignableDefinitionNode.expected b/csharp/ql/test/library-tests/assignables/AssignableDefinitionNode.expected index 7d1d5bf5af2c..0189d522a6cd 100644 --- a/csharp/ql/test/library-tests/assignables/AssignableDefinitionNode.expected +++ b/csharp/ql/test/library-tests/assignables/AssignableDefinitionNode.expected @@ -81,7 +81,7 @@ | Discards.cs:25:22:25:22 | String _ | Discards.cs:25:22:25:22 | String _ | | Finally.cs:7:13:7:17 | Int32 i = ... | Finally.cs:7:13:7:17 | Int32 i = ... | | Finally.cs:15:13:15:17 | ... = ... | Finally.cs:15:13:15:17 | ... = ... | -| Finally.cs:15:13:15:17 | ... = ... | Finally.cs:15:13:15:17 | [finally: exception(Exception)] ... = ... | +| Finally.cs:15:13:15:17 | ... = ... | Finally.cs:15:13:15:17 | [finally: exception] ... = ... | | Patterns.cs:7:16:7:23 | Object o = ... | Patterns.cs:7:16:7:23 | Object o = ... | | Patterns.cs:8:18:8:23 | Int32 i1 | Patterns.cs:8:18:8:23 | Int32 i1 | | Patterns.cs:12:23:12:31 | String s1 | Patterns.cs:12:23:12:31 | String s1 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected index 6177eb7e3350..4f78a6f8303e 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/BasicBlock.expected @@ -435,33 +435,32 @@ | 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 | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:7:10:7:11 | exit M1 (abnormal) | 5 | | Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | exit M1 (normal) | 5 | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:23:13:23:37 | call to method WriteLine | 7 | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | exit M2 | 1 | -| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 (abnormal) | 1 | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 (normal) | 1 | | Finally.cs:24:13:24:19 | return ...; | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | 5 | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:48:26:51 | [exception: Exception] true | 2 | -| Finally.cs:27:9:29:9 | {...} | Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | 6 | +| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | 2 | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | Finally.cs:34:21:34:24 | true | 6 | -| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | 9 | +| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:38:17:38:44 | [finally: exception] throw ...; | 5 | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:42:9:43:9 | {...} | Finally.cs:50:13:50:40 | call to method WriteLine | 5 | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:19:10:19:11 | exit M2 (abnormal) | 5 | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:58:13:58:37 | call to method WriteLine | 7 | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | exit M3 | 1 | -| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 (abnormal) | 1 | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | exit M3 (normal) | 1 | | Finally.cs:59:13:59:19 | return ...; | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | 5 | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:48:61:51 | [exception: Exception] true | 2 | -| Finally.cs:62:9:64:9 | {...} | Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | 6 | +| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | 2 | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | 5 | | Finally.cs:66:9:67:9 | {...} | Finally.cs:70:13:70:40 | call to method WriteLine | 5 | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | 4 | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:54:10:54:11 | exit M3 (abnormal) | 5 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:77:9:100:9 | while (...) ... | 6 | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | exit M4 | 1 | | Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | exit M4 (abnormal) | 1 | @@ -482,12 +481,12 @@ | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | 1 | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | 1 | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | 1 | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | 4 | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | 4 | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | 4 | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | 4 | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:97:21:97:23 | [finally: break] ...-- | 4 | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | 4 | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | 4 | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:97:21:97:23 | [finally: continue] ...-- | 4 | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | 4 | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | 4 | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:97:21:97:23 | [finally: return] ...-- | 4 | | Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:23 | ...-- | 4 | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:107:17:107:21 | access to field Field | 7 | @@ -500,75 +499,55 @@ | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:21 | access to field Field | 3 | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:28 | access to property Length | 1 | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:33 | ... == ... | 2 | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | 8 | +| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:17:110:49 | throw ...; | 1 | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | 1 | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | 7 | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | 7 | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:19:114:35 | [finally: exception] ... == ... | 7 | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:19:114:35 | ... == ... | 7 | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | 1 | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | 1 | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | 1 | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | 1 | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:114:17:114:36 | [false, finally: return] !... | 1 | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:114:17:114:36 | [false] !... | 1 | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | 1 | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | 1 | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | 1 | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | 1 | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:114:17:114:36 | [true, finally: return] !... | 1 | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:114:17:114:36 | [true] !... | 1 | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:17:115:40 | call to method WriteLine | 4 | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | 4 | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | 4 | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | 4 | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | 4 | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | 6 | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | 6 | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | 6 | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:17:116:32 | [finally: exception] ... > ... | 6 | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:17:116:32 | [finally: return] ... > ... | 6 | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:32 | ... > ... | 6 | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:17:117:36 | call to method WriteLine | 3 | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | 3 | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | 3 | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | 3 | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | 3 | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | 3 | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | exit M6 | 12 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:137:13:137:36 | call to method WriteLine | 7 | | Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | exit M7 | 2 | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | 4 | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:141:13:141:44 | [finally: exception] throw ...; | 4 | | Finally.cs:140:9:143:9 | {...} | Finally.cs:141:13:141:44 | throw ...; | 4 | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:151:17:151:28 | ... == ... | 8 | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | exit M8 | 1 | | Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | exit M8 (abnormal) | 1 | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | exit M8 (normal) | 1 | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | 7 | +| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:17:152:50 | throw ...; | 1 | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | 1 | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | 6 | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:158:21:158:31 | [finally: exception] access to property Length | 6 | | Finally.cs:155:9:169:9 | {...} | Finally.cs:158:21:158:31 | access to property Length | 6 | | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:21:158:36 | ... == ... | 2 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | 2 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | 2 | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | 1 | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | 1 | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:21:158:36 | [finally: exception] ... == ... | 2 | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | 1 | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:21:159:45 | throw ...; | 1 | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | 2 | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | 2 | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | 2 | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | 2 | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | 1 | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | 1 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | 1 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | 1 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | 1 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | 1 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | 1 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | 1 | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | 5 | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | 5 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | 5 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | 5 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | 5 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | 5 | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | 6 | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | 6 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | 5 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | 5 | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | 6 | | Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:42 | call to method WriteLine | 6 | -| 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 | [finally: exception] catch {...} | Finally.cs:167:17:167:37 | [finally: 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 | @@ -577,89 +556,66 @@ | 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 | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:176:10:176:11 | exit M9 (normal) | 1 | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | 6 | +| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | 1 | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | 1 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | 5 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | 5 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | 5 | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | 2 | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 2 | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 2 | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 2 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | 1 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | 1 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | 1 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | 1 | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | 1 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 1 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 1 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | 1 | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | 1 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | 1 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | 1 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | 3 | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | 3 | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | 3 | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | 2 | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | 2 | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | 3 | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception] throw ...; | 2 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:17:199:18 | access to parameter b1 | 6 | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | exit M10 | 1 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 (abnormal) | 1 | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | 6 | +| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:21:199:43 | throw ...; | 1 | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | 1 | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | 5 | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | 5 | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:21:205:22 | access to parameter b2 | 5 | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | 4 | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | 4 | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | 4 | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | 1 | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | 1 | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | 1 | +| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:25:205:47 | throw ...; | 1 | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | 1 | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | 1 | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | 3 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | 3 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | 3 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | 3 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | 3 | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | 3 | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | 3 | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | 3 | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:21:209:22 | access to parameter b3 | 3 | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | 2 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | 2 | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | 2 | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | 2 | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception] throw ...; | 2 | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:25:209:47 | throw ...; | 2 | | Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | exit M10 (normal) | 9 | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | 4 | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | 4 | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:28 | [finally: exception] ... = ... | 4 | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:220:13:220:36 | call to method WriteLine | 7 | | Finally.cs:222:9:225:9 | catch {...} | Finally.cs:224:13:224:38 | call to method WriteLine | 5 | | Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | exit M11 | 9 | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:239:21:239:22 | access to parameter b1 | 8 | | Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | exit M12 | 1 | -| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | exit M12 (abnormal) | 1 | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | 6 | +| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:21:240:43 | throw ...; | 1 | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | 1 | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | 5 | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | 5 | | Finally.cs:243:13:253:13 | {...} | Finally.cs:246:25:246:26 | access to parameter b2 | 5 | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | 5 | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | 5 | -| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | 5 | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | 1 | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | 1 | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | 1 | +| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:25:247:47 | throw ...; | 1 | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | 1 | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | 1 | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | 4 | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | 4 | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | 4 | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | 4 | | Finally.cs:250:17:252:17 | {...} | Finally.cs:254:13:254:44 | call to method WriteLine | 7 | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | 4 | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | 4 | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:233:10:233:12 | exit M12 (abnormal) | 5 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | exit M12 (normal) | 8 | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:267:13:267:34 | call to method WriteLine | 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: 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 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected index a59100474ea6..b4a4cbb6a157 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Condition.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Condition.expected @@ -1341,11 +1341,9 @@ conditionBlock | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | false | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | false | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:66:9:67:9 | {...} | false | -| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | false | | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:62:9:64:9 | {...} | true | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | true | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:66:9:67:9 | {...} | true | -| Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | true | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:66:9:67:9 | {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:74:10:74:11 | exit M4 (abnormal) | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:78:9:100:9 | {...} | true | @@ -1363,12 +1361,12 @@ conditionBlock | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | object creation of type Exception | true | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | true | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | true | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | true | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break] {...} | true | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | true | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue] {...} | true | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | true | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return] {...} | true | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | {...} | true | | Finally.cs:78:9:100:9 | {...} | Finally.cs:82:21:82:27 | return ...; | true | @@ -1385,17 +1383,17 @@ conditionBlock | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | false | | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | true | | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | false | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | false | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | false | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | false | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break] {...} | false | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | false | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | false | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue] {...} | false | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | true | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | true | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return] {...} | true | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | {...} | false | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:93:25:93:46 | [finally: return] throw ...; | true | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | true | -| Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | true | +| Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | true | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return] {...} | false | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:84:21:84:29 | continue; | true | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:85:17:86:26 | if (...) ... | false | @@ -1407,15 +1405,15 @@ conditionBlock | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | false | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | true | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | false | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | false | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | false | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | false | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break] {...} | false | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | true | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | true | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue] {...} | true | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | {...} | false | | Finally.cs:84:21:84:29 | continue; | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | true | | Finally.cs:84:21:84:29 | continue; | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | true | -| Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | true | +| Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | true | | Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue] {...} | false | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:86:21:86:26 | break; | true | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:89:13:99:13 | {...} | false | @@ -1423,17 +1421,17 @@ conditionBlock | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:25:93:46 | throw ...; | false | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | true | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | false | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | true | +| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | false | +| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | true | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break] {...} | true | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | {...} | false | | Finally.cs:86:21:86:26 | break; | Finally.cs:93:25:93:46 | [finally: break] throw ...; | true | | Finally.cs:86:21:86:26 | break; | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | true | -| Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | true | +| Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | true | | Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break] {...} | false | | Finally.cs:89:13:99:13 | {...} | Finally.cs:93:25:93:46 | throw ...; | true | | Finally.cs:89:13:99:13 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | true | -| Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | true | +| Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | true | | Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | {...} | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:108:17:108:23 | return ...; | true | | Finally.cs:107:33:107:33 | 0 | Finally.cs:109:13:110:49 | if (...) ... | false | @@ -1442,20 +1440,15 @@ conditionBlock | Finally.cs:107:33:107:33 | 0 | Finally.cs:110:17:110:49 | throw ...; | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:113:9:118:9 | {...} | false | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false, finally: return] !... | true | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false] !... | false | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true, finally: return] !... | true | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true] !... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | ...; | false | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | [finally: return] ...; | true | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | true | | Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | if (...) ... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | ...; | false | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | [finally: return] ...; | true | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:114:17:114:36 | [false, finally: return] !... | true | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:114:17:114:36 | [true, finally: return] !... | false | @@ -1463,228 +1456,149 @@ conditionBlock | Finally.cs:109:33:109:33 | 1 | Finally.cs:110:17:110:49 | throw ...; | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:113:9:118:9 | {...} | false | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [false] !... | false | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [true] !... | false | | Finally.cs:109:33:109:33 | 1 | Finally.cs:115:17:115:41 | ...; | false | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | true | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | true | | Finally.cs:109:33:109:33 | 1 | Finally.cs:116:13:117:37 | if (...) ... | false | | Finally.cs:109:33:109:33 | 1 | Finally.cs:117:17:117:37 | ...; | false | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | true | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | true | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | false | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | false | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | true | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | false | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | false | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | true | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | false | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | false | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:17:114:36 | [false, finally: exception] !... | true | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:17:114:36 | [true, finally: exception] !... | false | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:115:17:115:41 | [finally: exception] ...; | false | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:17:114:36 | [false] !... | true | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:17:114:36 | [true] !... | false | | Finally.cs:113:9:118:9 | {...} | Finally.cs:115:17:115:41 | ...; | false | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | true | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | true | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | true | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | true | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | true | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:117:17:117:37 | [finally: return] ...; | true | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:117:17:117:37 | ...; | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | exit M8 (abnormal) | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | exit M8 (normal) | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:152:17:152:50 | throw ...; | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | [finally: exception] {...} | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | {...} | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | 1 | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception] 1 | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | throw ...; | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | "1" | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception] "1" | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | false | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | {...} | false | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | true | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | true | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | true | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | catch {...} | false | | Finally.cs:158:36:158:36 | 1 | Finally.cs:159:21:159:45 | throw ...; | true | | Finally.cs:158:36:158:36 | 1 | Finally.cs:159:41:159:43 | "1" | true | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | true | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | true | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | true | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | true | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:159:41:159:43 | [finally: exception] "1" | true | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | true | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | true | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | true | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | true | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | true | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | true | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | true | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | false | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | false | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | true | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:21:199:43 | throw ...; | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | [finally: exception] {...} | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | {...} | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | throw ...; | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | false | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception] {...} | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | {...} | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | false | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | false | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | ...; | false | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | true | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | false | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | false | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | false | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | false | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | false | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | false | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception] ...; | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception] {...} | false | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | false | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:211:13:211:29 | [finally: exception] ...; | false | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:25:205:47 | throw ...; | true | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:31:205:46 | object creation of type ExceptionB | true | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | true | +| Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | true | | Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | {...} | false | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | +| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | true | | Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | object creation of type ExceptionC | false | | Finally.cs:202:9:212:9 | {...} | Finally.cs:211:13:211:29 | ...; | false | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | false | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | false | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | true | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:211:13:211:29 | [finally: exception] ...; | false | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:31:209:46 | object creation of type ExceptionC | true | | Finally.cs:208:13:210:13 | {...} | Finally.cs:211:13:211:29 | ...; | false | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:240:21:240:43 | throw ...; | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | [finally: exception] {...} | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | {...} | false | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | throw ...; | false | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | false | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | false | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | true | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | false | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | true | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception] {...} | true | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | {...} | false | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | {...} | false | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | true | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | true | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | true | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | false | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | true | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | true | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | true | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | false | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | true | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | true | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | true | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception] {...} | false | | Finally.cs:243:13:253:13 | {...} | Finally.cs:247:25:247:47 | throw ...; | true | | Finally.cs:243:13:253:13 | {...} | Finally.cs:247:31:247:46 | object creation of type ExceptionA | true | -| Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | true | +| Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | true | | Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | {...} | false | | Finally.cs:243:13:253:13 | {...} | Finally.cs:257:9:259:9 | {...} | false | | Foreach.cs:8:9:9:13 | foreach (... ... in ...) ... | Foreach.cs:6:10:6:11 | exit M1 (normal) | true | @@ -2751,91 +2665,62 @@ conditionFlow | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:109:13:110:49 | if (...) ... | false | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | true | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:113:9:118:9 | {...} | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | false | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | false | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | false | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:116:13:117:37 | if (...) ... | false | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | true | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | true | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | true | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [false] !... | true | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [true] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | false | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | true | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | false | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | true | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | false | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:103:10:103:11 | exit M5 (normal) | false | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:117:17:117:37 | ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | true | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:117:17:117:37 | [finally: return] ...; | true | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | true | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:155:9:169:9 | {...} | false | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:147:10:147:11 | exit M8 (normal) | false | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:159:41:159:43 | "1" | true | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | true | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | true | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:159:41:159:43 | [finally: exception] "1" | true | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:162:13:164:13 | {...} | true | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:165:13:168:13 | catch {...} | false | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | {...} | true | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | false | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | false | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | false | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | true | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | false | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | true | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:202:9:212:9 | {...} | false | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | true | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | false | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | true | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | false | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | true | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception] {...} | false | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | true | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:208:13:210:13 | {...} | false | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | false | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | false | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception] ...; | false | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | true | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:211:13:211:29 | ...; | false | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | true | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:243:13:253:13 | {...} | false | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | true | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | false | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | true | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | false | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | true | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception] {...} | false | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | true | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:250:17:252:17 | {...} | false | | LoopUnrolling.cs:9:13:9:28 | ... == ... | LoopUnrolling.cs:10:13:10:19 | return ...; | true | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Condition.ql b/csharp/ql/test/library-tests/controlflow/graph/Condition.ql index 25de07e9d5b5..61c801819246 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Condition.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/Condition.ql @@ -4,8 +4,7 @@ import ControlFlow query predicate conditionBlock( BasicBlocks::ConditionBlock cb, BasicBlock controlled, boolean testIsTrue ) { - cb.edgeDominates(controlled, - any(SuccessorTypes::ConditionalSuccessor s | testIsTrue = s.getValue())) + cb.edgeDominates(controlled, any(ConditionalSuccessor s | testIsTrue = s.getValue())) } ControlFlow::Node successor(ControlFlow::Node node, boolean kind) { diff --git a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected index f0a0c6459cbb..bc5082c4c18e 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Dominance.expected @@ -1067,11 +1067,11 @@ dominance | 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 | {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | -| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | +| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | | CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:40:14:40:38 | ...; | | 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" | @@ -1741,18 +1741,18 @@ dominance | 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 | {...} | Finally.cs:11:13:11:38 | ...; | -| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | +| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | {...} | | Finally.cs:11:13:11:38 | ...; | Finally.cs:11:31:11:36 | "Try1" | | Finally.cs:11:31:11:36 | "Try1" | Finally.cs:11:13:11:37 | call to method WriteLine | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:15:13:15:41 | [finally: exception] ...; | | Finally.cs:14:9:16:9 | {...} | Finally.cs:15:13:15:41 | ...; | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | | Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (normal) | | Finally.cs:15:13:15:41 | ...; | Finally.cs:15:31:15:39 | "Finally" | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:15:31:15:39 | [finally: exception] "Finally" | | Finally.cs:15:31:15:39 | "Finally" | Finally.cs:15:13:15:40 | call to method WriteLine | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:20:5:52:5 | {...} | | Finally.cs:20:5:52:5 | {...} | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:22:9:25:9 | {...} | @@ -1767,7 +1767,6 @@ dominance | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:48:26:51 | [exception: Exception] true | | Finally.cs:26:48:26:51 | [exception: Exception] true | Finally.cs:27:9:29:9 | {...} | | Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | -| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | Finally.cs:31:9:40:9 | {...} | @@ -1776,24 +1775,21 @@ dominance | Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... | | Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:34:21:34:24 | true | | Finally.cs:34:21:34:24 | true | Finally.cs:34:27:34:32 | throw ...; | -| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | +| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception] {...} | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception] throw ...; | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:49:9:51:9 | {...} | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:50:13:50:41 | [finally: exception] ...; | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:50:13:50:41 | [finally: return] ...; | | Finally.cs:49:9:51:9 | {...} | Finally.cs:50:13:50:41 | ...; | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:50:13:50:41 | ...; | Finally.cs:50:31:50:39 | "Finally" | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:50:31:50:39 | [finally: exception] "Finally" | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:50:31:50:39 | [finally: return] "Finally" | | Finally.cs:50:31:50:39 | "Finally" | Finally.cs:50:13:50:40 | call to method WriteLine | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:55:5:72:5 | {...} | | Finally.cs:55:5:72:5 | {...} | Finally.cs:56:9:71:9 | try {...} ... | @@ -1809,26 +1805,22 @@ dominance | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:48:61:51 | [exception: Exception] true | | Finally.cs:61:48:61:51 | [exception: Exception] true | Finally.cs:62:9:64:9 | {...} | | Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | -| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | Finally.cs:65:48:65:51 | [exception: Exception] null | | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | | Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | | Finally.cs:66:9:67:9 | {...} | Finally.cs:69:9:71:9 | {...} | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:70:13:70:41 | [finally: exception] ...; | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:70:13:70:41 | [finally: return] ...; | | Finally.cs:69:9:71:9 | {...} | Finally.cs:70:13:70:41 | ...; | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:70:13:70:41 | ...; | Finally.cs:70:31:70:39 | "Finally" | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:70:31:70:39 | [finally: exception] "Finally" | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:70:31:70:39 | [finally: return] "Finally" | | Finally.cs:70:31:70:39 | "Finally" | Finally.cs:70:13:70:40 | call to method WriteLine | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:75:5:101:5 | {...} | | Finally.cs:75:5:101:5 | {...} | Finally.cs:76:9:76:19 | ... ...; | @@ -1894,36 +1886,36 @@ dominance | Finally.cs:92:30:92:30 | [finally: continue] 3 | Finally.cs:92:25:92:30 | [finally: continue] ... == ... | | Finally.cs:92:30:92:30 | [finally: return] 3 | Finally.cs:92:25:92:30 | [finally: return] ... == ... | | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: break] throw ...; | -| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | -| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: return] throw ...; | -| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:25:93:46 | throw ...; | -| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | +| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally(1): exception] ...; | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:97:21:97:24 | [finally: break] ...; | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:97:21:97:24 | [finally: continue] ...; | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:97:21:97:24 | [finally: return] ...; | | Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:24 | ...; | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:97:21:97:23 | [finally: break] ...-- | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue] ...-- | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:97:21:97:23 | [finally: return] ...-- | | Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:97:21:97:23 | ...-- | | Finally.cs:97:21:97:24 | ...; | Finally.cs:97:21:97:21 | access to local variable i | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:104:5:119:5 | {...} | | Finally.cs:104:5:119:5 | {...} | Finally.cs:105:9:118:9 | try {...} ... | @@ -1931,10 +1923,9 @@ dominance | Finally.cs:106:9:111:9 | {...} | Finally.cs:107:13:108:23 | if (...) ... | | Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:21 | this access | | Finally.cs:107:17:107:21 | access to field Field | Finally.cs:107:17:107:28 | access to property Length | -| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | +| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception] {...} | | Finally.cs:107:17:107:21 | this access | Finally.cs:107:17:107:21 | access to field Field | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:33:107:33 | 0 | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:108:17:108:23 | return ...; | | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:109:13:110:49 | if (...) ... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:107:17:107:33 | ... == ... | @@ -1946,107 +1937,67 @@ dominance | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:113:9:118:9 | {...} | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:33 | ... == ... | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:17:110:49 | throw ...; | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:13:115:41 | if (...) ... | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception] this access | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:114:19:114:23 | [finally: return] this access | | Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:114:19:114:23 | this access | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:114:19:114:30 | [finally: exception] access to property Length | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:114:19:114:23 | [finally: exception] access to field Field | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:114:19:114:30 | [finally: return] access to property Length | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:114:19:114:23 | [finally: return] access to field Field | | Finally.cs:114:19:114:23 | access to field Field | Finally.cs:114:19:114:30 | access to property Length | | Finally.cs:114:19:114:23 | this access | Finally.cs:114:19:114:23 | access to field Field | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:114:35:114:35 | [finally: exception] 0 | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:114:35:114:35 | [finally: return] 0 | | Finally.cs:114:19:114:30 | access to property Length | Finally.cs:114:35:114:35 | 0 | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [false] !... | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [true] !... | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:114:35:114:35 | 0 | Finally.cs:114:19:114:35 | ... == ... | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:114:19:114:35 | [finally: exception] ... == ... | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:114:19:114:35 | [finally: return] ... == ... | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:35:115:39 | this access | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:35:115:39 | [finally: exception] this access | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:35:115:39 | [finally: return] this access | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:115:35:115:39 | [finally: exception] access to field Field | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:115:35:115:39 | [finally: return] access to field Field | | Finally.cs:115:35:115:39 | access to field Field | Finally.cs:115:17:115:40 | call to method WriteLine | | Finally.cs:115:35:115:39 | this access | Finally.cs:115:35:115:39 | access to field Field | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception] this access | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:17:116:21 | [finally: return] this access | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:21 | this access | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:116:17:116:28 | [finally: exception] access to property Length | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:116:17:116:21 | [finally: exception] access to field Field | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:116:17:116:28 | [finally: return] access to property Length | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:116:17:116:21 | [finally: return] access to field Field | | Finally.cs:116:17:116:21 | access to field Field | Finally.cs:116:17:116:28 | access to property Length | | Finally.cs:116:17:116:21 | this access | Finally.cs:116:17:116:21 | access to field Field | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:116:32:116:32 | [finally: exception] 0 | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:116:32:116:32 | [finally: return] 0 | | Finally.cs:116:17:116:28 | access to property Length | Finally.cs:116:32:116:32 | 0 | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:116:32:116:32 | 0 | Finally.cs:116:17:116:32 | ... > ... | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:116:17:116:32 | [finally: exception] ... > ... | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:116:17:116:32 | [finally: return] ... > ... | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:35:117:35 | 1 | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:35:117:35 | [finally: exception] 1 | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:35:117:35 | [finally: return] 1 | | Finally.cs:117:35:117:35 | 1 | Finally.cs:117:17:117:36 | call to method WriteLine | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:122:5:131:5 | {...} | | Finally.cs:121:10:121:11 | exit M6 (normal) | Finally.cs:121:10:121:11 | exit M6 | @@ -2064,16 +2015,16 @@ dominance | Finally.cs:134:5:145:5 | {...} | Finally.cs:135:9:143:9 | try {...} ... | | Finally.cs:135:9:143:9 | try {...} ... | Finally.cs:136:9:138:9 | {...} | | Finally.cs:136:9:138:9 | {...} | Finally.cs:137:13:137:37 | ...; | -| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | {...} | | Finally.cs:137:13:137:37 | ...; | Finally.cs:137:31:137:35 | "Try" | | Finally.cs:137:31:137:35 | "Try" | Finally.cs:137:13:137:36 | call to method WriteLine | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:141:41:141:42 | [finally: exception] "" | | Finally.cs:140:9:143:9 | {...} | Finally.cs:141:41:141:42 | "" | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception] throw ...; | | Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:141:13:141:44 | throw ...; | | Finally.cs:141:41:141:42 | "" | Finally.cs:141:19:141:43 | object creation of type ArgumentException | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:148:5:170:5 | {...} | | Finally.cs:148:5:170:5 | {...} | Finally.cs:149:9:169:9 | try {...} ... | | Finally.cs:149:9:169:9 | try {...} ... | Finally.cs:150:9:153:9 | {...} | @@ -2083,102 +2034,70 @@ dominance | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:155:9:169:9 | {...} | | Finally.cs:151:25:151:28 | null | Finally.cs:151:17:151:28 | ... == ... | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:17:152:50 | throw ...; | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception] {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | | Finally.cs:155:9:169:9 | {...} | Finally.cs:156:13:168:13 | try {...} ... | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception] {...} | | Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:157:13:160:13 | {...} | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | | Finally.cs:157:13:160:13 | {...} | Finally.cs:158:17:159:45 | if (...) ... | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | | Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:158:21:158:24 | access to parameter args | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception] access to property Length | | Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:158:21:158:31 | access to property Length | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:36:158:36 | 1 | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:21:158:36 | ... == ... | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:21:158:36 | [finally: exception] ... == ... | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [exception: Exception] "1" | | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | | Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:163:17:163:43 | [finally: exception] ...; | | Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:43 | ...; | | Finally.cs:163:17:163:43 | ...; | Finally.cs:163:35:163:38 | access to parameter args | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception] 0 | | Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:163:40:163:40 | 0 | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | | Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:17:163:42 | call to method WriteLine | | Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:163:35:163:41 | [finally: exception] access to array element | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:166:13:168:13 | [finally: exception] {...} | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:166:13:168:13 | {...} | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:167:17:167:38 | [finally: exception] ...; | | Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; | | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:35:167:36 | "" | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:167:35:167:36 | [finally: exception] "" | | 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:167:35:167:36 | [finally: exception] "" | Finally.cs:167:17:167:37 | [finally: 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 | @@ -2198,50 +2117,35 @@ dominance | Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:180:17:180:18 | access to parameter b1 | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | | 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:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception] throw ...; | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:196:5:214:5 | {...} | | Finally.cs:196:5:214:5 | {...} | Finally.cs:197:9:212:9 | try {...} ... | | Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:198:9:200:9 | {...} | @@ -2249,85 +2153,49 @@ dominance | Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:199:17:199:18 | access to parameter b1 | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:202:9:212:9 | {...} | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:21:199:43 | throw ...; | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | | Finally.cs:202:9:212:9 | {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception] {...} | | Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:204:13:206:13 | {...} | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | | Finally.cs:204:13:206:13 | {...} | Finally.cs:205:17:205:47 | if (...) ... | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | | Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:205:21:205:22 | access to parameter b2 | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception] {...} | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:17:209:47 | if (...) ... | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | | Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:209:21:209:22 | access to parameter b3 | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception] throw ...; | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:25:209:47 | throw ...; | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:211:26:211:28 | [finally: exception] "0" | | Finally.cs:211:13:211:16 | this access | Finally.cs:211:26:211:28 | "0" | | Finally.cs:211:13:211:28 | ... = ... | Finally.cs:213:9:213:25 | ...; | | Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:16 | this access | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:16 | [finally: exception] this access | | Finally.cs:211:26:211:28 | "0" | Finally.cs:211:13:211:28 | ... = ... | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:211:13:211:28 | [finally: exception] ... = ... | | Finally.cs:213:9:213:12 | this access | Finally.cs:213:22:213:24 | "1" | | Finally.cs:213:9:213:24 | ... = ... | Finally.cs:195:10:195:12 | exit M10 (normal) | | Finally.cs:213:9:213:25 | ...; | Finally.cs:213:9:213:12 | this access | @@ -2361,77 +2229,48 @@ dominance | Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:239:21:239:22 | access to parameter b1 | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:243:13:253:13 | {...} | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:21:240:43 | throw ...; | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | | Finally.cs:243:13:253:13 | {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception] {...} | | Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:245:17:248:17 | {...} | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | | Finally.cs:245:17:248:17 | {...} | Finally.cs:246:21:247:47 | if (...) ... | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | | Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:246:25:246:26 | access to parameter b2 | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:250:17:252:17 | {...} | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | -| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:251:21:251:55 | [finally(1): exception] ...; | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:251:21:251:55 | [finally: exception] ...; | | Finally.cs:250:17:252:17 | {...} | Finally.cs:251:21:251:55 | ...; | | Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:254:13:254:45 | ...; | | Finally.cs:251:21:251:55 | ...; | Finally.cs:251:39:251:53 | "Inner finally" | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | | Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:251:21:251:54 | call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | | Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | {...} | | Finally.cs:254:13:254:45 | ...; | Finally.cs:254:31:254:43 | "Mid finally" | | Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:254:13:254:44 | call to method WriteLine | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:258:13:258:47 | [finally: exception] ...; | | Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:47 | ...; | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | | Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:260:9:260:34 | ...; | | Finally.cs:258:13:258:47 | ...; | Finally.cs:258:31:258:45 | "Outer finally" | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | | Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:258:13:258:46 | call to method WriteLine | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (normal) | | Finally.cs:260:9:260:34 | ...; | Finally.cs:260:27:260:32 | "Done" | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:33 | call to method WriteLine | @@ -2439,28 +2278,28 @@ dominance | Finally.cs:264:5:274:5 | {...} | Finally.cs:265:9:273:9 | try {...} ... | | Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:266:9:268:9 | {...} | | Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:35 | ...; | -| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | +| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception] {...} | | Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | {...} | | Finally.cs:267:13:267:35 | ...; | Finally.cs:267:31:267:33 | "1" | | Finally.cs:267:31:267:33 | "1" | Finally.cs:267:13:267:34 | call to method WriteLine | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:271:13:271:35 | [finally: exception] ...; | | Finally.cs:270:9:273:9 | {...} | Finally.cs:271:13:271:35 | ...; | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception] ...; | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:272:13:272:19 | ...; | | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:271:31:271:33 | [finally: exception] "3" | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception] 3 | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | | Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:272:13:272:18 | [finally: exception] ... = ... | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | -| 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:13:272:19 | [finally: exception] ...; | Finally.cs:272:13:272:13 | [finally: 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)] ... + ... | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:272:13:272:18 | [finally: 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 | @@ -5445,11 +5284,11 @@ postDominance | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:29:5:41:5 | {...} | | CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | | CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:31:9:34:9 | {...} | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | -| CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | +| CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | | 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 | ...; | @@ -6094,7 +5933,7 @@ postDominance | 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 (abnormal) | Finally.cs:15:13:15:40 | [finally: 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 | | Finally.cs:9:9:16:9 | try {...} ... | Finally.cs:8:5:17:5 | {...} | @@ -6103,12 +5942,13 @@ postDominance | Finally.cs:11:13:11:38 | ...; | Finally.cs:10:9:12:9 | {...} | | Finally.cs:11:31:11:36 | "Try1" | Finally.cs:11:13:11:38 | ...; | | Finally.cs:14:9:16:9 | {...} | Finally.cs:11:13:11:37 | call to method WriteLine | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:15:31:15:39 | [finally: exception] "Finally" | | Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:15:31:15:39 | "Finally" | | Finally.cs:15:13:15:41 | ...; | Finally.cs:14:9:16:9 | {...} | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:15:31:15:39 | "Finally" | Finally.cs:15:13:15:41 | ...; | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:15:13:15:41 | [finally: exception] ...; | +| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:50:13:50:40 | call to method WriteLine | | Finally.cs:20:5:52:5 | {...} | Finally.cs:19:10:19:11 | enter M2 | @@ -6125,28 +5965,24 @@ postDominance | Finally.cs:33:13:35:13 | {...} | Finally.cs:32:13:39:13 | try {...} ... | | Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:33:13:35:13 | {...} | | Finally.cs:34:21:34:24 | true | Finally.cs:34:17:34:32 | if (...) ... | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:34:27:34:32 | throw ...; | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:34:27:34:32 | throw ...; | +| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:37:13:39:13 | [finally: exception] {...} | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:28:13:28:18 | throw ...; | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:24:13:24:19 | return ...; | | Finally.cs:49:9:51:9 | {...} | Finally.cs:42:9:43:9 | {...} | -| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | -| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:50:31:50:39 | [finally: exception] "Finally" | | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:50:31:50:39 | [finally: return] "Finally" | | Finally.cs:50:13:50:40 | call to method WriteLine | Finally.cs:50:31:50:39 | "Finally" | | Finally.cs:50:13:50:41 | ...; | Finally.cs:49:9:51:9 | {...} | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:49:9:51:9 | [finally: return] {...} | | Finally.cs:50:31:50:39 | "Finally" | Finally.cs:50:13:50:41 | ...; | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:50:13:50:41 | [finally: exception] ...; | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:50:13:50:41 | [finally: return] ...; | +| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:70:13:70:40 | call to method WriteLine | | Finally.cs:55:5:72:5 | {...} | Finally.cs:54:10:54:11 | enter M3 | @@ -6164,20 +6000,16 @@ postDominance | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:65:48:65:51 | [exception: Exception] null | | Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | | Finally.cs:66:9:67:9 | {...} | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:63:13:63:18 | throw ...; | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:59:13:59:19 | return ...; | | Finally.cs:69:9:71:9 | {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | -| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:70:31:70:39 | [finally: exception] "Finally" | | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:70:31:70:39 | [finally: return] "Finally" | | Finally.cs:70:13:70:40 | call to method WriteLine | Finally.cs:70:31:70:39 | "Finally" | | Finally.cs:70:13:70:41 | ...; | Finally.cs:69:9:71:9 | {...} | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:69:9:71:9 | [finally: return] {...} | | Finally.cs:70:31:70:39 | "Finally" | Finally.cs:70:13:70:41 | ...; | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:70:13:70:41 | [finally: exception] ...; | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:70:13:70:41 | [finally: return] ...; | | Finally.cs:74:10:74:11 | exit M4 (normal) | Finally.cs:77:16:77:20 | ... > ... | | Finally.cs:74:10:74:11 | exit M4 (normal) | Finally.cs:97:21:97:23 | [finally: break] ...-- | @@ -6235,29 +6067,29 @@ postDominance | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:92:25:92:30 | [finally: continue] ... == ... | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:92:25:92:30 | [finally: return] ... == ... | | Finally.cs:96:17:98:17 | {...} | Finally.cs:92:25:92:30 | ... == ... | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:97:21:97:24 | [finally(1): exception] ...; | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:97:21:97:24 | [finally: break] ...; | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:97:21:97:24 | [finally: continue] ...; | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:97:21:97:24 | [finally: return] ...; | | Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:97:21:97:24 | ...; | | Finally.cs:97:21:97:23 | ...-- | Finally.cs:97:21:97:21 | access to local variable i | -| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | -| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | +| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | -| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | -| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | +| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | | Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | | Finally.cs:97:21:97:24 | ...; | Finally.cs:96:17:98:17 | {...} | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:103:10:103:11 | exit M5 (normal) | Finally.cs:116:17:116:32 | ... > ... | | Finally.cs:103:10:103:11 | exit M5 (normal) | Finally.cs:116:17:116:32 | [finally: return] ... > ... | @@ -6277,52 +6109,33 @@ postDominance | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:21 | access to field Field | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:109:33:109:33 | 1 | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:28 | access to property Length | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:108:17:108:23 | return ...; | | Finally.cs:113:9:118:9 | {...} | Finally.cs:109:17:109:33 | ... == ... | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:113:9:118:9 | [finally: exception] {...} | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:113:9:118:9 | [finally: return] {...} | | Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:114:19:114:23 | [finally: exception] this access | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:114:19:114:23 | [finally: return] this access | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | | Finally.cs:114:19:114:23 | access to field Field | Finally.cs:114:19:114:23 | this access | | Finally.cs:114:19:114:23 | this access | Finally.cs:114:13:115:41 | if (...) ... | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:114:19:114:23 | [finally: exception] access to field Field | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:114:19:114:23 | [finally: return] access to field Field | | Finally.cs:114:19:114:30 | access to property Length | Finally.cs:114:19:114:23 | access to field Field | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:35:114:35 | 0 | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:35:114:35 | [finally: exception] 0 | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:35:114:35 | [finally: return] 0 | | Finally.cs:114:35:114:35 | 0 | Finally.cs:114:19:114:30 | access to property Length | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:114:19:114:30 | [finally: exception] access to property Length | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:114:19:114:30 | [finally: return] access to property Length | -| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | -| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: exception] access to field Field | | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:115:35:115:39 | [finally: return] access to field Field | | Finally.cs:115:17:115:40 | call to method WriteLine | Finally.cs:115:35:115:39 | access to field Field | | Finally.cs:115:17:115:41 | ...; | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:114:17:114:36 | [true, finally: return] !... | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:115:35:115:39 | [finally: exception] this access | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:115:35:115:39 | [finally: return] this access | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:115:17:115:41 | [finally: return] ...; | | Finally.cs:115:35:115:39 | access to field Field | Finally.cs:115:35:115:39 | this access | @@ -6331,40 +6144,26 @@ postDominance | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:114:17:114:36 | [false] !... | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:115:17:115:40 | call to method WriteLine | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:116:17:116:21 | [finally: exception] this access | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:116:17:116:21 | [finally: return] this access | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:116:17:116:21 | access to field Field | Finally.cs:116:17:116:21 | this access | | Finally.cs:116:17:116:21 | this access | Finally.cs:116:13:117:37 | if (...) ... | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:116:17:116:21 | [finally: exception] access to field Field | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:116:17:116:21 | [finally: return] access to field Field | | Finally.cs:116:17:116:28 | access to property Length | Finally.cs:116:17:116:21 | access to field Field | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:116:32:116:32 | 0 | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:116:32:116:32 | [finally: exception] 0 | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:116:32:116:32 | [finally: return] 0 | | Finally.cs:116:32:116:32 | 0 | Finally.cs:116:17:116:28 | access to property Length | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:116:17:116:28 | [finally: exception] access to property Length | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:116:17:116:28 | [finally: return] access to property Length | -| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | -| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | -| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | +| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: exception] 1 | | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:117:35:117:35 | [finally: return] 1 | | Finally.cs:117:17:117:36 | call to method WriteLine | Finally.cs:117:35:117:35 | 1 | | Finally.cs:117:35:117:35 | 1 | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:121:10:121:11 | exit M6 | Finally.cs:121:10:121:11 | exit M6 (normal) | | Finally.cs:121:10:121:11 | exit M6 (normal) | Finally.cs:125:17:125:40 | Double temp = ... | @@ -6384,12 +6183,12 @@ postDominance | Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:137:31:137:35 | "Try" | | Finally.cs:137:13:137:37 | ...; | Finally.cs:136:9:138:9 | {...} | | Finally.cs:137:31:137:35 | "Try" | Finally.cs:137:13:137:37 | ...; | -| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | +| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | | Finally.cs:141:13:141:44 | throw ...; | Finally.cs:141:19:141:43 | object creation of type ArgumentException | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:141:41:141:42 | [finally: exception] "" | | Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:141:41:141:42 | "" | | Finally.cs:141:41:141:42 | "" | Finally.cs:140:9:143:9 | {...} | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:158:21:158:36 | ... == ... | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:163:17:163:42 | call to method WriteLine | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:167:17:167:37 | call to method WriteLine | @@ -6400,28 +6199,20 @@ postDominance | Finally.cs:151:17:151:20 | access to parameter args | Finally.cs:151:13:152:50 | if (...) ... | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:151:25:151:28 | null | | Finally.cs:151:25:151:28 | null | Finally.cs:151:17:151:20 | access to parameter args | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:152:17:152:50 | throw ...; | | Finally.cs:155:9:169:9 | {...} | Finally.cs:151:17:151:28 | ... == ... | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:155:9:169:9 | [finally: exception] {...} | | Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:155:9:169:9 | {...} | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | | Finally.cs:157:13:160:13 | {...} | Finally.cs:156:13:168:13 | try {...} ... | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:157:13:160:13 | [finally: exception] {...} | | Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:157:13:160:13 | {...} | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | | Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:158:17:159:45 | if (...) ... | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:21:158:24 | access to parameter args | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:158:36:158:36 | 1 | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:41:159:43 | "1" | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:159:27:159:44 | object creation of type Exception | @@ -6429,55 +6220,38 @@ postDominance | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:161:52:161:54 | [exception: Exception] "1" | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | | Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | -| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | -| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | +| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:163:35:163:41 | [finally: exception] access to array element | | Finally.cs:163:17:163:42 | call to method WriteLine | Finally.cs:163:35:163:41 | access to array element | | Finally.cs:163:17:163:43 | ...; | Finally.cs:162:13:164:13 | {...} | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:162:13:164:13 | [finally: exception] {...} | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:163:17:163:43 | [finally: exception] ...; | | Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:163:17:163:43 | ...; | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:163:40:163:40 | [finally: exception] 0 | | Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:40:163:40 | 0 | | Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:38 | access to parameter args | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | | Finally.cs:166:13:168:13 | {...} | Finally.cs:165:13:168:13 | catch {...} | -| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | -| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | +| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:167:35:167:36 | [finally: exception] "" | | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:35:167:36 | "" | | Finally.cs:167:17:167:38 | ...; | Finally.cs:166:13:168:13 | {...} | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:166:13:168:13 | [finally: exception] {...} | | 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:167:35:167:36 | [finally: exception] "" | Finally.cs:167:17:167:38 | [finally: 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 | {...} | @@ -6498,95 +6272,60 @@ postDominance | Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:179:9:181:9 | {...} | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:13:180:43 | if (...) ... | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:180:17:180:18 | access to parameter b1 | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | -| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | +| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:195:10:195:12 | exit M10 (normal) | Finally.cs:213:9:213:24 | ... = ... | | Finally.cs:196:5:214:5 | {...} | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:197:9:212:9 | try {...} ... | Finally.cs:196:5:214:5 | {...} | | Finally.cs:198:9:200:9 | {...} | Finally.cs:197:9:212:9 | try {...} ... | | Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:198:9:200:9 | {...} | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:13:199:43 | if (...) ... | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:199:21:199:43 | throw ...; | | Finally.cs:202:9:212:9 | {...} | Finally.cs:199:17:199:18 | access to parameter b1 | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:202:9:212:9 | [finally: exception] {...} | | Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:202:9:212:9 | {...} | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | | Finally.cs:204:13:206:13 | {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:204:13:206:13 | [finally: exception] {...} | | Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:204:13:206:13 | {...} | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:17:205:47 | if (...) ... | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | | Finally.cs:208:13:210:13 | {...} | Finally.cs:205:21:205:22 | access to parameter b2 | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:208:13:210:13 | [finally: exception] {...} | | Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:17:209:47 | if (...) ... | -| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:209:25:209:47 | throw ...; | Finally.cs:209:31:209:46 | object creation of type ExceptionC | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:211:13:211:16 | this access | Finally.cs:211:13:211:29 | ...; | | Finally.cs:211:13:211:28 | ... = ... | Finally.cs:211:26:211:28 | "0" | -| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | -| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | +| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:211:26:211:28 | [finally: exception] "0" | | Finally.cs:211:13:211:29 | ...; | Finally.cs:209:21:209:22 | access to parameter b3 | | Finally.cs:211:26:211:28 | "0" | Finally.cs:211:13:211:16 | this access | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:211:13:211:16 | [finally: exception] this access | | Finally.cs:213:9:213:12 | this access | Finally.cs:213:9:213:25 | ...; | | Finally.cs:213:9:213:24 | ... = ... | Finally.cs:213:22:213:24 | "1" | | Finally.cs:213:9:213:25 | ...; | Finally.cs:211:13:211:28 | ... = ... | @@ -6611,6 +6350,7 @@ postDominance | Finally.cs:230:9:230:33 | call to method WriteLine | Finally.cs:230:27:230:32 | "Done" | | Finally.cs:230:9:230:34 | ...; | Finally.cs:228:13:228:40 | call to method WriteLine | | Finally.cs:230:27:230:32 | "Done" | Finally.cs:230:9:230:34 | ...; | +| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | | Finally.cs:233:10:233:12 | exit M12 (normal) | Finally.cs:260:9:260:33 | call to method WriteLine | | Finally.cs:234:5:261:5 | {...} | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:235:9:259:9 | try {...} ... | Finally.cs:234:5:261:5 | {...} | @@ -6619,68 +6359,42 @@ postDominance | Finally.cs:238:13:241:13 | {...} | Finally.cs:237:13:253:13 | try {...} ... | | Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:238:13:241:13 | {...} | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:239:17:240:43 | if (...) ... | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:240:21:240:43 | throw ...; | | Finally.cs:243:13:253:13 | {...} | Finally.cs:239:21:239:22 | access to parameter b1 | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:243:13:253:13 | [finally: exception] {...} | | Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:243:13:253:13 | {...} | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | | Finally.cs:245:17:248:17 | {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:245:17:248:17 | [finally: exception] {...} | | Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:245:17:248:17 | {...} | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:246:21:247:47 | if (...) ... | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | | Finally.cs:250:17:252:17 | {...} | Finally.cs:246:25:246:26 | access to parameter b2 | -| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | +| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | +| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | +| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | | Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:251:39:251:53 | "Inner finally" | | Finally.cs:251:21:251:55 | ...; | Finally.cs:250:17:252:17 | {...} | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:251:21:251:55 | ...; | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:251:21:251:55 | [finally(1): exception] ...; | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:251:21:251:55 | [finally: exception] ...; | | Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:254:31:254:43 | "Mid finally" | | Finally.cs:254:13:254:45 | ...; | Finally.cs:251:21:251:54 | call to method WriteLine | | Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:254:13:254:45 | ...; | | Finally.cs:257:9:259:9 | {...} | Finally.cs:254:13:254:44 | call to method WriteLine | -| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | -| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | | Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:258:31:258:45 | "Outer finally" | | Finally.cs:258:13:258:47 | ...; | Finally.cs:257:9:259:9 | {...} | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:257:9:259:9 | [finally: exception] {...} | | Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:258:13:258:47 | ...; | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:258:13:258:47 | [finally: exception] ...; | | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:260:27:260:32 | "Done" | | Finally.cs:260:9:260:34 | ...; | Finally.cs:258:13:258:46 | call to method WriteLine | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:34 | ...; | -| Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | +| Finally.cs:263:10:263:12 | exit M13 (abnormal) | Finally.cs:272:13:272:18 | [finally: exception] ... = ... | | Finally.cs:263:10:263:12 | exit M13 (normal) | Finally.cs:272:13:272:18 | ... = ... | | Finally.cs:264:5:274:5 | {...} | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:264:5:274:5 | {...} | @@ -6689,22 +6403,22 @@ postDominance | Finally.cs:267:13:267:35 | ...; | Finally.cs:266:9:268:9 | {...} | | Finally.cs:267:31:267:33 | "1" | Finally.cs:267:13:267:35 | ...; | | Finally.cs:270:9:273:9 | {...} | Finally.cs:267:13:267:34 | call to method WriteLine | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:271:31:271:33 | [finally: exception] "3" | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:271:31:271:33 | "3" | | Finally.cs:271:13:271:35 | ...; | Finally.cs:270:9:273:9 | {...} | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:270:9:273:9 | [finally: exception] {...} | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:35 | ...; | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:271:13:271:35 | [finally: exception] ...; | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:272:13:272:19 | [finally: exception] ...; | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:13:272:19 | ...; | | Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:18:272:18 | 3 | | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:272:13:272:18 | ... + ... | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:272:18:272:18 | [finally: exception] 3 | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:272:13:272:18 | [finally: exception] ... + ... | | Finally.cs:272:13:272:19 | ...; | Finally.cs:271:13:271:34 | call to method WriteLine | -| 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:13:272:19 | [finally: exception] ...; | Finally.cs:271:13:271:34 | [finally: 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 | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:272:13:272:13 | [finally: 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 | {...} | @@ -10543,14 +10257,13 @@ blockDominance | 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)] {...} | +| Finally.cs:7:10:7:11 | enter M1 | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:7:10:7:11 | enter M1 | Finally.cs:14:9:16:9 | {...} | | 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)] {...} | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:14:9:16:9 | {...} | Finally.cs:14:9:16:9 | {...} | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | enter M2 | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | exit M2 | -| Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | exit M2 (normal) | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:24:13:24:19 | return ...; | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | @@ -10561,11 +10274,10 @@ blockDominance | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:34:27:34:32 | throw ...; | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:42:9:43:9 | {...} | +| Finally.cs:19:10:19:11 | enter M2 | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | exit M2 | -| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 (normal) | | Finally.cs:24:13:24:19 | return ...; | Finally.cs:24:13:24:19 | return ...; | -| Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:27:9:29:9 | {...} | @@ -10574,6 +10286,7 @@ blockDominance | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:34:27:34:32 | throw ...; | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | +| Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:27:9:29:9 | {...} | | Finally.cs:27:9:29:9 | {...} | Finally.cs:27:9:29:9 | {...} | @@ -10588,9 +10301,9 @@ blockDominance | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:42:9:43:9 | {...} | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | enter M3 | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | exit M3 | -| Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | exit M3 (normal) | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:59:13:59:19 | return ...; | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | @@ -10599,31 +10312,27 @@ blockDominance | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:54:10:54:11 | enter M3 | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | +| Finally.cs:54:10:54:11 | enter M3 | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | exit M3 | -| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | exit M3 (normal) | | Finally.cs:59:13:59:19 | return ...; | Finally.cs:59:13:59:19 | return ...; | -| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:62:9:64:9 | {...} | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | +| Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:62:9:64:9 | {...} | | Finally.cs:62:9:64:9 | {...} | Finally.cs:62:9:64:9 | {...} | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | | Finally.cs:66:9:67:9 | {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | enter M4 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | exit M4 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | exit M4 (abnormal) | @@ -10644,12 +10353,12 @@ blockDominance | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:96:17:98:17 | {...} | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | exit M4 | @@ -10674,12 +10383,12 @@ blockDominance | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:77:16:77:16 | access to local variable i | Finally.cs:96:17:98:17 | {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:74:10:74:11 | exit M4 (abnormal) | @@ -10698,18 +10407,18 @@ blockDominance | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | | Finally.cs:78:9:100:9 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:78:9:100:9 | {...} | Finally.cs:96:17:98:17 | {...} | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:82:21:82:27 | return ...; | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:93:25:93:46 | [finally: return] throw ...; | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | -| Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:82:21:82:27 | return ...; | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:83:17:84:29 | if (...) ... | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:84:21:84:29 | continue; | @@ -10722,16 +10431,16 @@ blockDominance | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | [finally: continue] {...} | | Finally.cs:83:17:84:29 | if (...) ... | Finally.cs:96:17:98:17 | {...} | | Finally.cs:84:21:84:29 | continue; | Finally.cs:84:21:84:29 | continue; | | Finally.cs:84:21:84:29 | continue; | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | | Finally.cs:84:21:84:29 | continue; | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | -| Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:84:21:84:29 | continue; | Finally.cs:96:17:98:17 | [finally: continue] {...} | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:85:17:86:26 | if (...) ... | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:86:21:86:26 | break; | @@ -10740,19 +10449,19 @@ blockDominance | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:25:93:46 | throw ...; | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | [finally: break] {...} | | Finally.cs:85:17:86:26 | if (...) ... | Finally.cs:96:17:98:17 | {...} | | Finally.cs:86:21:86:26 | break; | Finally.cs:86:21:86:26 | break; | | Finally.cs:86:21:86:26 | break; | Finally.cs:93:25:93:46 | [finally: break] throw ...; | | Finally.cs:86:21:86:26 | break; | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | -| Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:86:21:86:26 | break; | Finally.cs:96:17:98:17 | [finally: break] {...} | | Finally.cs:89:13:99:13 | {...} | Finally.cs:89:13:99:13 | {...} | | Finally.cs:89:13:99:13 | {...} | Finally.cs:93:25:93:46 | throw ...; | | Finally.cs:89:13:99:13 | {...} | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | +| Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | | Finally.cs:89:13:99:13 | {...} | Finally.cs:96:17:98:17 | {...} | | Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:93:25:93:46 | [finally: break] throw ...; | | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | @@ -10760,22 +10469,22 @@ blockDominance | Finally.cs:93:25:93:46 | throw ...; | Finally.cs:93:25:93:46 | throw ...; | | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: break] throw ...; | | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | -| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | -| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: return] throw ...; | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | -| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:25:93:46 | throw ...; | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:96:17:98:17 | {...} | Finally.cs:96:17:98:17 | {...} | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:103:10:103:11 | enter M5 | @@ -10790,33 +10499,22 @@ blockDominance | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:109:33:109:33 | 1 | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:113:9:118:9 | [finally: exception] {...} | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: exception] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: exception] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:103:10:103:11 | exit M5 | Finally.cs:103:10:103:11 | exit M5 | | Finally.cs:103:10:103:11 | exit M5 (abnormal) | Finally.cs:103:10:103:11 | exit M5 (abnormal) | @@ -10830,27 +10528,16 @@ blockDominance | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:109:33:109:33 | 1 | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:107:33:107:33 | 0 | Finally.cs:103:10:103:11 | exit M5 (normal) | | Finally.cs:107:33:107:33 | 0 | Finally.cs:107:33:107:33 | 0 | @@ -10861,20 +10548,15 @@ blockDominance | Finally.cs:107:33:107:33 | 0 | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:107:33:107:33 | 0 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:107:33:107:33 | 0 | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:107:33:107:33 | 0 | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:107:33:107:33 | 0 | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:108:17:108:23 | return ...; | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:114:17:114:36 | [false, finally: return] !... | @@ -10888,118 +10570,75 @@ blockDominance | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:17:109:28 | access to property Length | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:33:109:33 | 1 | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:33:109:33 | 1 | | Finally.cs:109:33:109:33 | 1 | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:109:33:109:33 | 1 | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | | Finally.cs:109:33:109:33 | 1 | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:109:33:109:33 | 1 | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:109:33:109:33 | 1 | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:17:110:49 | throw ...; | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:103:10:103:11 | exit M5 (abnormal) | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:113:9:118:9 | [finally: exception] {...} | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:17:114:36 | [false, finally: exception] !... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:17:114:36 | [true, finally: exception] !... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:115:17:115:41 | [finally: exception] ...; | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:113:9:118:9 | {...} | Finally.cs:113:9:118:9 | {...} | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:17:114:36 | [false] !... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:115:17:115:41 | ...; | | Finally.cs:113:9:118:9 | {...} | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:117:17:117:37 | ...; | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | enter M6 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | enter M7 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | exit M7 (abnormal) | -| Finally.cs:133:10:133:11 | enter M7 | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:133:10:133:11 | enter M7 | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:140:9:143:9 | {...} | | Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | exit M7 (abnormal) | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:140:9:143:9 | {...} | Finally.cs:140:9:143:9 | {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | enter M8 | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | exit M8 | @@ -11007,80 +10646,54 @@ blockDominance | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | exit M8 (normal) | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:152:17:152:50 | throw ...; | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | [finally: exception] {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:155:9:169:9 | {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | 1 | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | [finally: exception] {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:162:13:164:13 | {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | -| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | +| Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:165:13:168:13 | catch {...} | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | exit M8 | | Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | exit M8 (abnormal) | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | exit M8 (normal) | | Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:17:152:50 | throw ...; | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:147:10:147:11 | exit M8 (abnormal) | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:17:152:50 | throw ...; | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception] {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:159:41:159:43 | [finally: exception] "1" | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:162:13:164:13 | [finally: exception] {...} | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:147:10:147:11 | exit M8 (abnormal) | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:155:9:169:9 | [finally: exception] {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:159:41:159:43 | [finally: exception] "1" | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:162:13:164:13 | [finally: exception] {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | | Finally.cs:155:9:169:9 | {...} | Finally.cs:147:10:147:11 | exit M8 (normal) | | Finally.cs:155:9:169:9 | {...} | Finally.cs:155:9:169:9 | {...} | | Finally.cs:155:9:169:9 | {...} | Finally.cs:158:36:158:36 | 1 | @@ -11095,44 +10708,30 @@ blockDominance | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:36:158:36 | 1 | | Finally.cs:158:36:158:36 | 1 | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:158:36:158:36 | 1 | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:159:41:159:43 | [finally: exception] "1" | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:162:13:164:13 | [finally: exception] {...} | | Finally.cs:162:13:164:13 | {...} | Finally.cs:162:13:164:13 | {...} | -| 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 | [finally: exception] catch {...} | Finally.cs:165:13:168:13 | [finally: 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 | @@ -11144,55 +10743,34 @@ blockDominance | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:176:10:176:11 | enter M9 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | 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) | | Finally.cs:176:10:176:11 | exit M9 (normal) | Finally.cs:176:10:176:11 | exit M9 (normal) | | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | exit M9 (normal) | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | @@ -11201,186 +10779,119 @@ blockDominance | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | exit M10 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:21:199:43 | throw ...; | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | [finally: exception] {...} | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:202:9:212:9 | {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | [finally: exception] {...} | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:195:10:195:12 | enter M10 | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | exit M10 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 (abnormal) | | Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:21:199:43 | throw ...; | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:21:199:43 | throw ...; | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception] {...} | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:208:13:210:13 | [finally: exception] {...} | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:211:13:211:29 | [finally: exception] ...; | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:202:9:212:9 | [finally: exception] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:202:9:212:9 | {...} | Finally.cs:202:9:212:9 | {...} | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:25:205:47 | throw ...; | | Finally.cs:202:9:212:9 | {...} | Finally.cs:205:31:205:46 | object creation of type ExceptionB | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | +| Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | | Finally.cs:202:9:212:9 | {...} | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | +| Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | | Finally.cs:202:9:212:9 | {...} | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:202:9:212:9 | {...} | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | | Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:25:205:47 | throw ...; | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception] {...} | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:208:13:210:13 | {...} | Finally.cs:208:13:210:13 | {...} | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:208:13:210:13 | {...} | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:216:10:216:12 | enter M11 | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:222:9:225:9 | catch {...} | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:227:9:229:9 | {...} | @@ -11388,83 +10899,61 @@ blockDominance | Finally.cs:227:9:229:9 | {...} | Finally.cs:227:9:229:9 | {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | exit M12 | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | exit M12 (abnormal) | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:240:21:240:43 | throw ...; | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | [finally: exception] {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:243:13:253:13 | {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:250:17:252:17 | {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | -| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | [finally: exception] {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:257:9:259:9 | {...} | | Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | exit M12 | -| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | exit M12 (abnormal) | | Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:21:240:43 | throw ...; | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:21:240:43 | throw ...; | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception] {...} | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:243:13:253:13 | [finally: exception] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:243:13:253:13 | {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:247:25:247:47 | throw ...; | | Finally.cs:243:13:253:13 | {...} | Finally.cs:247:31:247:46 | object creation of type ExceptionA | -| Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | +| Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:250:17:252:17 | {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:257:9:259:9 | {...} | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | | Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | throw ...; | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | -| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:250:17:252:17 | {...} | Finally.cs:250:17:252:17 | {...} | | Finally.cs:250:17:252:17 | {...} | Finally.cs:257:9:259:9 | {...} | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:257:9:259:9 | [finally: exception] {...} | | Finally.cs:257:9:259:9 | {...} | Finally.cs:257:9:259:9 | {...} | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:263:10:263:12 | enter M13 | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:263:10:263:12 | exit M13 | -| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | +| Finally.cs:263:10:263:12 | enter M13 | Finally.cs:270:9:273:9 | [finally: exception] {...} | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:270:9:273:9 | {...} | | 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: exception] {...} | Finally.cs:270:9:273:9 | [finally: 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 | @@ -14617,12 +14106,11 @@ postBlockDominance | 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)] {...} | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:14:9:16:9 | [finally: exception] {...} | | Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | enter M1 | | Finally.cs:14:9:16:9 | {...} | Finally.cs:14:9:16:9 | {...} | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | enter M2 | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | exit M2 | -| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 (abnormal) | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | enter M2 | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 (normal) | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:24:13:24:19 | return ...; | @@ -14645,9 +14133,9 @@ postBlockDominance | Finally.cs:42:9:43:9 | {...} | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | | Finally.cs:42:9:43:9 | {...} | Finally.cs:42:9:43:9 | {...} | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:49:9:51:9 | [finally: exception] {...} | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | enter M3 | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | exit M3 | -| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 (abnormal) | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | enter M3 | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | exit M3 (normal) | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:59:13:59:19 | return ...; | @@ -14668,7 +14156,7 @@ postBlockDominance | Finally.cs:66:9:67:9 | {...} | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | | Finally.cs:66:9:67:9 | {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | | Finally.cs:66:9:67:9 | {...} | Finally.cs:66:9:67:9 | {...} | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:69:9:71:9 | [finally: exception] {...} | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | enter M4 | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | exit M4 | | Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | exit M4 (abnormal) | @@ -14707,14 +14195,14 @@ postBlockDominance | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:31:93:45 | object creation of type Exception | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:86:21:86:26 | break; | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:96:17:98:17 | [finally: break] {...} | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:84:21:84:29 | continue; | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:96:17:98:17 | [finally: continue] {...} | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:82:21:82:27 | return ...; | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:96:17:98:17 | [finally: return] {...} | | Finally.cs:96:17:98:17 | {...} | Finally.cs:89:13:99:13 | {...} | @@ -14755,32 +14243,23 @@ postBlockDominance | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:33:109:33 | 1 | | Finally.cs:110:17:110:49 | throw ...; | Finally.cs:110:17:110:49 | throw ...; | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:113:9:118:9 | [finally: exception] {...} | | Finally.cs:113:9:118:9 | {...} | Finally.cs:109:13:110:49 | if (...) ... | | Finally.cs:113:9:118:9 | {...} | Finally.cs:109:17:109:28 | access to property Length | | Finally.cs:113:9:118:9 | {...} | Finally.cs:109:33:109:33 | 1 | | Finally.cs:113:9:118:9 | {...} | Finally.cs:113:9:118:9 | {...} | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:114:17:114:36 | [false] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:115:17:115:41 | ...; | Finally.cs:114:17:114:36 | [true] !... | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:17:115:41 | ...; | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:17:115:41 | [finally: exception] ...; | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:114:17:114:36 | [true, finally: return] !... | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:17:115:41 | [finally: return] ...; | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:108:17:108:23 | return ...; | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | @@ -14795,14 +14274,12 @@ postBlockDominance | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:115:17:115:41 | ...; | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:13:117:37 | if (...) ... | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:17:117:37 | ...; | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:17:117:37 | [finally: exception] ...; | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:17:117:37 | [finally: return] ...; | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | enter M6 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | enter M7 | | Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | exit M7 (abnormal) | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:140:9:143:9 | [finally: exception] {...} | | Finally.cs:140:9:143:9 | {...} | Finally.cs:140:9:143:9 | {...} | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | enter M8 | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | exit M8 | @@ -14821,41 +14298,32 @@ postBlockDominance | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:165:13:168:13 | catch {...} | | Finally.cs:152:17:152:50 | throw ...; | Finally.cs:152:17:152:50 | throw ...; | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:155:9:169:9 | [finally: exception] {...} | | Finally.cs:155:9:169:9 | {...} | Finally.cs:147:10:147:11 | enter M8 | | Finally.cs:155:9:169:9 | {...} | Finally.cs:155:9:169:9 | {...} | | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:36:158:36 | 1 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:36:158:36 | [finally: exception] 1 | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:41:159:43 | "1" | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:41:159:43 | [finally: exception] "1" | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:159:41:159:43 | "1" | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:159:21:159:45 | throw ...; | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:159:41:159:43 | "1" | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:162:13:164:13 | [finally: exception] {...} | | Finally.cs:162:13:164:13 | {...} | Finally.cs:162:13:164:13 | {...} | -| 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 | [finally: exception] catch {...} | Finally.cs:165:13:168:13 | [finally: 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 | @@ -14876,71 +14344,54 @@ postBlockDominance | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | enter M9 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | exit M10 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 (abnormal) | | Finally.cs:199:21:199:43 | throw ...; | Finally.cs:199:21:199:43 | throw ...; | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:27:199:42 | object creation of type ExceptionA | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:202:9:212:9 | [finally: exception] {...} | | Finally.cs:202:9:212:9 | {...} | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:202:9:212:9 | {...} | Finally.cs:202:9:212:9 | {...} | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | | Finally.cs:205:25:205:47 | throw ...; | Finally.cs:205:25:205:47 | throw ...; | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:31:205:46 | object creation of type ExceptionB | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:208:13:210:13 | [finally: exception] {...} | | Finally.cs:208:13:210:13 | {...} | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:208:13:210:13 | {...} | Finally.cs:202:9:212:9 | {...} | | Finally.cs:208:13:210:13 | {...} | Finally.cs:208:13:210:13 | {...} | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:31:209:46 | object creation of type ExceptionC | | Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | enter M10 | | Finally.cs:211:13:211:29 | ...; | Finally.cs:202:9:212:9 | {...} | | Finally.cs:211:13:211:29 | ...; | Finally.cs:208:13:210:13 | {...} | | Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:29 | ...; | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:29 | [finally: exception] ...; | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:216:10:216:12 | enter M11 | | Finally.cs:222:9:225:9 | catch {...} | Finally.cs:222:9:225:9 | catch {...} | | Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | enter M11 | @@ -14948,35 +14399,29 @@ postBlockDominance | Finally.cs:227:9:229:9 | {...} | Finally.cs:227:9:229:9 | {...} | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | exit M12 | -| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | exit M12 (abnormal) | | Finally.cs:240:21:240:43 | throw ...; | Finally.cs:240:21:240:43 | throw ...; | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:27:240:42 | object creation of type ExceptionA | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:243:13:253:13 | [finally: exception] {...} | | Finally.cs:243:13:253:13 | {...} | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:243:13:253:13 | {...} | Finally.cs:243:13:253:13 | {...} | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | | Finally.cs:247:25:247:47 | throw ...; | Finally.cs:247:25:247:47 | throw ...; | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:31:247:46 | object creation of type ExceptionA | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:250:17:252:17 | [finally: exception] {...} | | Finally.cs:250:17:252:17 | {...} | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:250:17:252:17 | {...} | Finally.cs:243:13:253:13 | {...} | | Finally.cs:250:17:252:17 | {...} | Finally.cs:250:17:252:17 | {...} | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:257:9:259:9 | [finally: exception] {...} | | Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | enter M12 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:243:13:253:13 | {...} | | Finally.cs:257:9:259:9 | {...} | Finally.cs:250:17:252:17 | {...} | | Finally.cs:257:9:259:9 | {...} | Finally.cs:257:9:259:9 | {...} | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:263:10:263:12 | enter M13 | | 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: exception] {...} | Finally.cs:270:9:273:9 | [finally: 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 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected index fd87b8db0584..2c2e977ae126 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/EnclosingCallable.expected @@ -1146,10 +1146,10 @@ nodeEnclosing | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:31:9:34:9 | {...} | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:28:10:28:10 | M | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:28:10:28:10 | M | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:28:10:28:10 | M | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:28:10:28:10 | M | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:28:10:28:10 | M | | CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:28:10:28:10 | M | | 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 | @@ -1899,14 +1899,14 @@ nodeEnclosing | Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:7:10:7:11 | M1 | | Finally.cs:11:13:11:38 | ...; | Finally.cs:7:10:7:11 | M1 | | Finally.cs:11:31:11:36 | "Try1" | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:7:10:7:11 | M1 | | Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:7:10:7:11 | M1 | | Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:7:10:7:11 | M1 | | Finally.cs:15:13:15:41 | ...; | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:7:10:7:11 | M1 | | Finally.cs:15:31:15:39 | "Finally" | Finally.cs:7:10:7:11 | M1 | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:7:10:7:11 | M1 | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:7:10:7:11 | M1 | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | M2 | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | M2 | | Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | M2 | @@ -1931,27 +1931,23 @@ nodeEnclosing | Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:19:10:19:11 | M2 | | Finally.cs:34:21:34:24 | true | Finally.cs:19:10:19:11 | M2 | | Finally.cs:34:27:34:32 | throw ...; | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:19:10:19:11 | M2 | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:42:9:43:9 | {...} | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:13:50:40 | call to method WriteLine | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:13:50:41 | ...; | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:31:50:39 | "Finally" | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:19:10:19:11 | M2 | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:19:10:19:11 | M2 | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | M3 | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | M3 | @@ -1976,21 +1972,17 @@ nodeEnclosing | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:54:10:54:11 | M3 | | Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:54:10:54:11 | M3 | | Finally.cs:66:9:67:9 | {...} | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:54:10:54:11 | M3 | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:54:10:54:11 | M3 | | Finally.cs:69:9:71:9 | {...} | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:13:70:40 | call to method WriteLine | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:13:70:41 | ...; | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:31:70:39 | "Finally" | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:54:10:54:11 | M3 | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:54:10:54:11 | M3 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | M4 | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | M4 | @@ -2058,37 +2050,37 @@ nodeEnclosing | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:74:10:74:11 | M4 | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:74:10:74:11 | M4 | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:23 | ...-- | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:24 | ...; | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:74:10:74:11 | M4 | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:74:10:74:11 | M4 | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:103:10:103:11 | exit M5 | Finally.cs:103:10:103:11 | M5 | @@ -2112,115 +2104,71 @@ nodeEnclosing | Finally.cs:109:33:109:33 | 1 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:110:17:110:49 | throw ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:103:10:103:11 | M5 | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:103:10:103:11 | M5 | | Finally.cs:113:9:118:9 | {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:23 | access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:23 | this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:30 | access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:35:114:35 | 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:40 | call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:41 | ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:35:115:39 | access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:35:115:39 | this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:21 | access to field Field | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:21 | this access | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:28 | access to property Length | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:32:116:32 | 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:36 | call to method WriteLine | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:37 | ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:35:117:35 | 1 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | M6 | | Finally.cs:121:10:121:11 | exit M6 | Finally.cs:121:10:121:11 | M6 | @@ -2243,14 +2191,14 @@ nodeEnclosing | Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:133:10:133:11 | M7 | | Finally.cs:137:13:137:37 | ...; | Finally.cs:133:10:133:11 | M7 | | Finally.cs:137:31:137:35 | "Try" | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:133:10:133:11 | M7 | | Finally.cs:140:9:143:9 | {...} | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:133:10:133:11 | M7 | | Finally.cs:141:13:141:44 | throw ...; | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:133:10:133:11 | M7 | | Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:133:10:133:11 | M7 | | Finally.cs:141:41:141:42 | "" | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:133:10:133:11 | M7 | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | M8 | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | M8 | | Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | M8 | @@ -2264,108 +2212,74 @@ nodeEnclosing | Finally.cs:151:25:151:28 | null | Finally.cs:147:10:147:11 | M8 | | Finally.cs:152:17:152:50 | throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:155:9:169:9 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:157:13:160:13 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:36:158:36 | 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:41:159:43 | "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:162:13:164:13 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:17:163:42 | call to method WriteLine | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:17:163:43 | ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:35:163:41 | access to array element | Finally.cs:147:10:147:11 | M8 | | Finally.cs:163:40:163:40 | 0 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:147:10:147:11 | M8 | -| 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:163:40:163:40 | [finally: exception] 0 | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:165:13:168:13 | [finally: 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:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:166:13:168:13 | {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:147:10:147:11 | M8 | | Finally.cs:167:17:167:38 | ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:147:10:147:11 | M8 | | 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:167:35:167:36 | [finally: 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 | @@ -2393,51 +2307,35 @@ nodeEnclosing | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:176:10:176:11 | M9 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:176:10:176:11 | M9 | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:176:10:176:11 | M9 | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | M10 | @@ -2449,84 +2347,48 @@ nodeEnclosing | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:199:21:199:43 | throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:202:9:212:9 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:204:13:206:13 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:25:205:47 | throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:208:13:210:13 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:25:209:47 | throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:13:211:16 | this access | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:13:211:28 | ... = ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:26:211:28 | "0" | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:195:10:195:12 | M10 | | Finally.cs:213:9:213:12 | this access | Finally.cs:195:10:195:12 | M10 | | Finally.cs:213:9:213:24 | ... = ... | Finally.cs:195:10:195:12 | M10 | | Finally.cs:213:9:213:25 | ...; | Finally.cs:195:10:195:12 | M10 | @@ -2565,78 +2427,47 @@ nodeEnclosing | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:233:10:233:12 | M12 | | Finally.cs:240:21:240:43 | throw ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:243:13:253:13 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:233:10:233:12 | M12 | | Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:245:17:248:17 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:233:10:233:12 | M12 | | Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:233:10:233:12 | M12 | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:247:25:247:47 | throw ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:250:17:252:17 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:251:21:251:55 | ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:233:10:233:12 | M12 | | Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:254:13:254:45 | ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:258:13:258:47 | ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:233:10:233:12 | M12 | | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:233:10:233:12 | M12 | | Finally.cs:260:9:260:34 | ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:233:10:233:12 | M12 | @@ -2650,24 +2481,24 @@ nodeEnclosing | Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:263:10:263:12 | M13 | | Finally.cs:267:13:267:35 | ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:267:31:267:33 | "1" | 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: exception] {...} | Finally.cs:263:10:263:12 | M13 | | Finally.cs:270:9:273:9 | {...} | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:263:10:263:12 | M13 | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:263:10:263:12 | M13 | | Finally.cs:271:13:271:35 | ...; | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:263:10:263:12 | M13 | | Finally.cs:271:31:271:33 | "3" | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:18 | ... + ... | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:263:10:263:12 | M13 | | Finally.cs:272:13:272:19 | ...; | Finally.cs:263:10:263:12 | M13 | -| Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:263:10:263:12 | M13 | +| Finally.cs:272:13:272:19 | [finally: 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 | +| Finally.cs:272:18:272:18 | [finally: 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 | @@ -5296,11 +5127,10 @@ blockEnclosing | 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 | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:7:10:7:11 | M1 | | Finally.cs:14:9:16:9 | {...} | Finally.cs:7:10:7:11 | M1 | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:19:10:19:11 | M2 | | Finally.cs:19:10:19:11 | exit M2 | Finally.cs:19:10:19:11 | M2 | -| Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | M2 | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | M2 | | Finally.cs:24:13:24:19 | return ...; | Finally.cs:19:10:19:11 | M2 | | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | Finally.cs:19:10:19:11 | M2 | @@ -5311,9 +5141,9 @@ blockEnclosing | Finally.cs:34:27:34:32 | throw ...; | Finally.cs:19:10:19:11 | M2 | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:42:9:43:9 | {...} | Finally.cs:19:10:19:11 | M2 | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:19:10:19:11 | M2 | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:54:10:54:11 | M3 | | Finally.cs:54:10:54:11 | exit M3 | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | M3 | | Finally.cs:54:10:54:11 | exit M3 (normal) | Finally.cs:54:10:54:11 | M3 | | Finally.cs:59:13:59:19 | return ...; | Finally.cs:54:10:54:11 | M3 | | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | Finally.cs:54:10:54:11 | M3 | @@ -5322,7 +5152,7 @@ blockEnclosing | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:54:10:54:11 | M3 | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:54:10:54:11 | M3 | | Finally.cs:66:9:67:9 | {...} | Finally.cs:54:10:54:11 | M3 | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:54:10:54:11 | M3 | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:54:10:54:11 | M3 | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:74:10:74:11 | M4 | | Finally.cs:74:10:74:11 | exit M4 | Finally.cs:74:10:74:11 | M4 | | Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | M4 | @@ -5343,12 +5173,12 @@ blockEnclosing | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:74:10:74:11 | M4 | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:74:10:74:11 | M4 | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:74:10:74:11 | M4 | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:74:10:74:11 | M4 | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:96:17:98:17 | {...} | Finally.cs:74:10:74:11 | M4 | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:103:10:103:11 | M5 | @@ -5363,38 +5193,27 @@ blockEnclosing | Finally.cs:109:33:109:33 | 1 | Finally.cs:103:10:103:11 | M5 | | Finally.cs:110:17:110:49 | throw ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:103:10:103:11 | M5 | | Finally.cs:113:9:118:9 | {...} | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:41 | ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:37 | ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:103:10:103:11 | M5 | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:103:10:103:11 | M5 | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:103:10:103:11 | M5 | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:121:10:121:11 | M6 | | Finally.cs:133:10:133:11 | enter M7 | Finally.cs:133:10:133:11 | M7 | | Finally.cs:133:10:133:11 | exit M7 (abnormal) | Finally.cs:133:10:133:11 | M7 | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:133:10:133:11 | M7 | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:133:10:133:11 | M7 | | Finally.cs:140:9:143:9 | {...} | Finally.cs:133:10:133:11 | M7 | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:147:10:147:11 | M8 | | Finally.cs:147:10:147:11 | exit M8 | Finally.cs:147:10:147:11 | M8 | @@ -5402,34 +5221,25 @@ blockEnclosing | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | M8 | | Finally.cs:152:17:152:50 | throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:155:9:169:9 | {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:158:36:158:36 | 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:21:159:45 | throw ...; | Finally.cs:147:10:147:11 | M8 | | Finally.cs:159:41:159:43 | "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:147:10:147:11 | M8 | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:147:10:147:11 | M8 | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:147:10:147:11 | M8 | | Finally.cs:162:13:164:13 | {...} | Finally.cs:147:10:147:11 | M8 | -| 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 | [finally: 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 | @@ -5441,86 +5251,63 @@ blockEnclosing | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:176:10:176:11 | M9 | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:176:10:176:11 | M9 | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | M9 | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:176:10:176:11 | M9 | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:176:10:176:11 | M9 | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:195:10:195:12 | exit M10 | Finally.cs:195:10:195:12 | M10 | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | M10 | | Finally.cs:199:21:199:43 | throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:202:9:212:9 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:25:205:47 | throw ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:195:10:195:12 | M10 | | Finally.cs:208:13:210:13 | {...} | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:195:10:195:12 | M10 | | Finally.cs:211:13:211:29 | ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:195:10:195:12 | M10 | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:195:10:195:12 | M10 | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:195:10:195:12 | M10 | | Finally.cs:216:10:216:12 | enter M11 | Finally.cs:216:10:216:12 | M11 | | Finally.cs:222:9:225:9 | catch {...} | Finally.cs:216:10:216:12 | M11 | | Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | M11 | | Finally.cs:233:10:233:12 | enter M12 | Finally.cs:233:10:233:12 | M12 | | Finally.cs:233:10:233:12 | exit M12 | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:233:10:233:12 | exit M12 (abnormal) | Finally.cs:233:10:233:12 | M12 | | Finally.cs:240:21:240:43 | throw ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:243:13:253:13 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:233:10:233:12 | M12 | | Finally.cs:247:25:247:47 | throw ...; | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:250:17:252:17 | {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:233:10:233:12 | M12 | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:233:10:233:12 | M12 | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:257:9:259:9 | {...} | Finally.cs:233:10:233:12 | M12 | | Finally.cs:263:10:263:12 | enter M13 | Finally.cs:263:10:263:12 | M13 | | 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: 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 | diff --git a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected index 1664d77538a6..8726e77130bb 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/NodeGraph.expected @@ -372,7 +372,7 @@ | Assert.cs:16:20:16:32 | ... ? ... : ... | Assert.cs:16:16:16:32 | String s = ... | | | Assert.cs:16:24:16:27 | null | Assert.cs:16:20:16:32 | ... ? ... : ... | | | Assert.cs:16:31:16:32 | "" | Assert.cs:16:20:16:32 | ... ? ... : ... | | -| Assert.cs:17:9:17:24 | [assertion failure] call to method IsNull | Assert.cs:14:10:14:11 | exit M2 (abnormal) | exception(AssertFailedException) | +| Assert.cs:17:9:17:24 | [assertion failure] call to method IsNull | Assert.cs:14:10:14:11 | exit M2 (abnormal) | exception | | Assert.cs:17:9:17:24 | [assertion success] call to method IsNull | Assert.cs:18:9:18:36 | ...; | | | Assert.cs:17:9:17:25 | ...; | Assert.cs:17:23:17:23 | access to local variable s | | | Assert.cs:17:23:17:23 | access to local variable s | Assert.cs:17:9:17:24 | [assertion failure] call to method IsNull | non-null | @@ -392,7 +392,7 @@ | Assert.cs:23:20:23:32 | ... ? ... : ... | Assert.cs:23:16:23:32 | String s = ... | | | Assert.cs:23:24:23:27 | null | Assert.cs:23:20:23:32 | ... ? ... : ... | | | Assert.cs:23:31:23:32 | "" | Assert.cs:23:20:23:32 | ... ? ... : ... | | -| Assert.cs:24:9:24:27 | [assertion failure] call to method IsNotNull | Assert.cs:21:10:21:11 | exit M3 (abnormal) | exception(AssertFailedException) | +| Assert.cs:24:9:24:27 | [assertion failure] call to method IsNotNull | Assert.cs:21:10:21:11 | exit M3 (abnormal) | exception | | Assert.cs:24:9:24:27 | [assertion success] call to method IsNotNull | Assert.cs:25:9:25:36 | ...; | | | Assert.cs:24:9:24:28 | ...; | Assert.cs:24:26:24:26 | access to local variable s | | | Assert.cs:24:26:24:26 | access to local variable s | Assert.cs:24:9:24:27 | [assertion failure] call to method IsNotNull | null | @@ -412,7 +412,7 @@ | Assert.cs:30:20:30:32 | ... ? ... : ... | Assert.cs:30:16:30:32 | String s = ... | | | Assert.cs:30:24:30:27 | null | Assert.cs:30:20:30:32 | ... ? ... : ... | | | Assert.cs:30:31:30:32 | "" | Assert.cs:30:20:30:32 | ... ? ... : ... | | -| Assert.cs:31:9:31:32 | [assertion failure] call to method IsTrue | Assert.cs:28:10:28:11 | exit M4 (abnormal) | exception(AssertFailedException) | +| Assert.cs:31:9:31:32 | [assertion failure] call to method IsTrue | Assert.cs:28:10:28:11 | exit M4 (abnormal) | exception | | Assert.cs:31:9:31:32 | [assertion success] call to method IsTrue | Assert.cs:32:9:32:36 | ...; | | | Assert.cs:31:9:31:33 | ...; | Assert.cs:31:23:31:23 | access to local variable s | | | Assert.cs:31:23:31:23 | access to local variable s | Assert.cs:31:28:31:31 | null | | @@ -434,7 +434,7 @@ | Assert.cs:37:20:37:32 | ... ? ... : ... | Assert.cs:37:16:37:32 | String s = ... | | | Assert.cs:37:24:37:27 | null | Assert.cs:37:20:37:32 | ... ? ... : ... | | | Assert.cs:37:31:37:32 | "" | Assert.cs:37:20:37:32 | ... ? ... : ... | | -| Assert.cs:38:9:38:32 | [assertion failure] call to method IsTrue | Assert.cs:35:10:35:11 | exit M5 (abnormal) | exception(AssertFailedException) | +| Assert.cs:38:9:38:32 | [assertion failure] call to method IsTrue | Assert.cs:35:10:35:11 | exit M5 (abnormal) | exception | | Assert.cs:38:9:38:32 | [assertion success] call to method IsTrue | Assert.cs:39:9:39:36 | ...; | | | Assert.cs:38:9:38:33 | ...; | Assert.cs:38:23:38:23 | access to local variable s | | | Assert.cs:38:23:38:23 | access to local variable s | Assert.cs:38:28:38:31 | null | | @@ -456,7 +456,7 @@ | Assert.cs:44:20:44:32 | ... ? ... : ... | Assert.cs:44:16:44:32 | String s = ... | | | Assert.cs:44:24:44:27 | null | Assert.cs:44:20:44:32 | ... ? ... : ... | | | Assert.cs:44:31:44:32 | "" | Assert.cs:44:20:44:32 | ... ? ... : ... | | -| Assert.cs:45:9:45:33 | [assertion failure] call to method IsFalse | Assert.cs:42:10:42:11 | exit M6 (abnormal) | exception(AssertFailedException) | +| Assert.cs:45:9:45:33 | [assertion failure] call to method IsFalse | Assert.cs:42:10:42:11 | exit M6 (abnormal) | exception | | Assert.cs:45:9:45:33 | [assertion success] call to method IsFalse | Assert.cs:46:9:46:36 | ...; | | | Assert.cs:45:9:45:34 | ...; | Assert.cs:45:24:45:24 | access to local variable s | | | Assert.cs:45:24:45:24 | access to local variable s | Assert.cs:45:29:45:32 | null | | @@ -478,7 +478,7 @@ | Assert.cs:51:20:51:32 | ... ? ... : ... | Assert.cs:51:16:51:32 | String s = ... | | | Assert.cs:51:24:51:27 | null | Assert.cs:51:20:51:32 | ... ? ... : ... | | | Assert.cs:51:31:51:32 | "" | Assert.cs:51:20:51:32 | ... ? ... : ... | | -| Assert.cs:52:9:52:33 | [assertion failure] call to method IsFalse | Assert.cs:49:10:49:11 | exit M7 (abnormal) | exception(AssertFailedException) | +| Assert.cs:52:9:52:33 | [assertion failure] call to method IsFalse | Assert.cs:49:10:49:11 | exit M7 (abnormal) | exception | | Assert.cs:52:9:52:33 | [assertion success] call to method IsFalse | Assert.cs:53:9:53:36 | ...; | | | Assert.cs:52:9:52:34 | ...; | Assert.cs:52:24:52:24 | access to local variable s | | | Assert.cs:52:24:52:24 | access to local variable s | Assert.cs:52:29:52:32 | null | | @@ -502,7 +502,7 @@ | Assert.cs:58:20:58:32 | [b (line 56): true] ... ? ... : ... | Assert.cs:58:16:58:32 | [b (line 56): true] String s = ... | | | Assert.cs:58:24:58:27 | [b (line 56): true] null | Assert.cs:58:20:58:32 | [b (line 56): true] ... ? ... : ... | | | Assert.cs:58:31:58:32 | [b (line 56): false] "" | Assert.cs:58:20:58:32 | [b (line 56): false] ... ? ... : ... | | -| Assert.cs:59:9:59:37 | [assertion failure] call to method IsTrue | Assert.cs:56:10:56:11 | exit M8 (abnormal) | exception(AssertFailedException) | +| Assert.cs:59:9:59:37 | [assertion failure] call to method IsTrue | Assert.cs:56:10:56:11 | exit M8 (abnormal) | exception | | Assert.cs:59:9:59:37 | [assertion success] call to method IsTrue | Assert.cs:60:9:60:36 | ...; | | | Assert.cs:59:9:59:38 | [b (line 56): false] ...; | Assert.cs:59:23:59:23 | [b (line 56): false] access to local variable s | | | Assert.cs:59:9:59:38 | [b (line 56): true] ...; | Assert.cs:59:23:59:23 | [b (line 56): true] access to local variable s | | @@ -535,7 +535,7 @@ | Assert.cs:65:20:65:32 | [b (line 63): true] ... ? ... : ... | Assert.cs:65:16:65:32 | [b (line 63): true] String s = ... | | | Assert.cs:65:24:65:27 | [b (line 63): true] null | Assert.cs:65:20:65:32 | [b (line 63): true] ... ? ... : ... | | | Assert.cs:65:31:65:32 | [b (line 63): false] "" | Assert.cs:65:20:65:32 | [b (line 63): false] ... ? ... : ... | | -| Assert.cs:66:9:66:38 | [assertion failure] call to method IsFalse | Assert.cs:63:10:63:11 | exit M9 (abnormal) | exception(AssertFailedException) | +| Assert.cs:66:9:66:38 | [assertion failure] call to method IsFalse | Assert.cs:63:10:63:11 | exit M9 (abnormal) | exception | | Assert.cs:66:9:66:38 | [assertion success] call to method IsFalse | Assert.cs:67:9:67:36 | ...; | | | Assert.cs:66:9:66:39 | [b (line 63): false] ...; | Assert.cs:66:24:66:24 | [b (line 63): false] access to local variable s | | | Assert.cs:66:9:66:39 | [b (line 63): true] ...; | Assert.cs:66:24:66:24 | [b (line 63): true] access to local variable s | | @@ -568,7 +568,7 @@ | Assert.cs:72:20:72:32 | [b (line 70): true] ... ? ... : ... | Assert.cs:72:16:72:32 | [b (line 70): true] String s = ... | | | Assert.cs:72:24:72:27 | [b (line 70): true] null | Assert.cs:72:20:72:32 | [b (line 70): true] ... ? ... : ... | | | Assert.cs:72:31:72:32 | [b (line 70): false] "" | Assert.cs:72:20:72:32 | [b (line 70): false] ... ? ... : ... | | -| Assert.cs:73:9:73:37 | [assertion failure] call to method IsTrue | Assert.cs:70:10:70:12 | exit M10 (abnormal) | exception(AssertFailedException) | +| Assert.cs:73:9:73:37 | [assertion failure] call to method IsTrue | Assert.cs:70:10:70:12 | exit M10 (abnormal) | exception | | Assert.cs:73:9:73:37 | [assertion success] call to method IsTrue | Assert.cs:74:9:74:36 | ...; | | | Assert.cs:73:9:73:38 | [b (line 70): false] ...; | Assert.cs:73:23:73:23 | [b (line 70): false] access to local variable s | | | Assert.cs:73:9:73:38 | [b (line 70): true] ...; | Assert.cs:73:23:73:23 | [b (line 70): true] access to local variable s | | @@ -601,7 +601,7 @@ | Assert.cs:79:20:79:32 | [b (line 77): true] ... ? ... : ... | Assert.cs:79:16:79:32 | [b (line 77): true] String s = ... | | | Assert.cs:79:24:79:27 | [b (line 77): true] null | Assert.cs:79:20:79:32 | [b (line 77): true] ... ? ... : ... | | | Assert.cs:79:31:79:32 | [b (line 77): false] "" | Assert.cs:79:20:79:32 | [b (line 77): false] ... ? ... : ... | | -| Assert.cs:80:9:80:38 | [assertion failure] call to method IsFalse | Assert.cs:77:10:77:12 | exit M11 (abnormal) | exception(AssertFailedException) | +| Assert.cs:80:9:80:38 | [assertion failure] call to method IsFalse | Assert.cs:77:10:77:12 | exit M11 (abnormal) | exception | | Assert.cs:80:9:80:38 | [assertion success] call to method IsFalse | Assert.cs:81:9:81:36 | ...; | | | Assert.cs:80:9:80:39 | [b (line 77): false] ...; | Assert.cs:80:24:80:24 | [b (line 77): false] access to local variable s | | | Assert.cs:80:9:80:39 | [b (line 77): true] ...; | Assert.cs:80:24:80:24 | [b (line 77): true] access to local variable s | | @@ -666,8 +666,8 @@ | Assert.cs:90:13:90:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:90:9:90:25 | [b (line 84): true] ... = ... | | | Assert.cs:90:17:90:20 | [b (line 84): true] null | Assert.cs:90:13:90:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:90:24:90:25 | [b (line 84): false] "" | Assert.cs:90:13:90:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): false] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:91:9:91:24 | [assertion failure, b (line 84): true] call to method IsNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:91:9:91:24 | [assertion success, b (line 84): false] call to method IsNull | Assert.cs:92:9:92:36 | [b (line 84): false] ...; | | | Assert.cs:91:9:91:24 | [assertion success, b (line 84): true] call to method IsNull | Assert.cs:92:9:92:36 | [b (line 84): true] ...; | | | Assert.cs:91:9:91:25 | [b (line 84): false] ...; | Assert.cs:91:23:91:23 | [b (line 84): false] access to local variable s | | @@ -694,8 +694,8 @@ | Assert.cs:94:13:94:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:94:9:94:25 | [b (line 84): true] ... = ... | | | Assert.cs:94:17:94:20 | [b (line 84): true] null | Assert.cs:94:13:94:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:94:24:94:25 | [b (line 84): false] "" | Assert.cs:94:13:94:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): false] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:95:9:95:27 | [assertion failure, b (line 84): true] call to method IsNotNull | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:95:9:95:27 | [assertion success, b (line 84): false] call to method IsNotNull | Assert.cs:96:9:96:36 | [b (line 84): false] ...; | | | Assert.cs:95:9:95:27 | [assertion success, b (line 84): true] call to method IsNotNull | Assert.cs:96:9:96:36 | [b (line 84): true] ...; | | | Assert.cs:95:9:95:28 | [b (line 84): false] ...; | Assert.cs:95:26:95:26 | [b (line 84): false] access to local variable s | | @@ -722,8 +722,8 @@ | Assert.cs:98:13:98:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:98:9:98:25 | [b (line 84): true] ... = ... | | | Assert.cs:98:17:98:20 | [b (line 84): true] null | Assert.cs:98:13:98:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:98:24:98:25 | [b (line 84): false] "" | Assert.cs:98:13:98:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:99:9:99:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:99:9:99:32 | [assertion success, b (line 84): false] call to method IsTrue | Assert.cs:100:9:100:36 | [b (line 84): false] ...; | | | Assert.cs:99:9:99:32 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:100:9:100:36 | [b (line 84): true] ...; | | | Assert.cs:99:9:99:33 | [b (line 84): false] ...; | Assert.cs:99:23:99:23 | [b (line 84): false] access to local variable s | | @@ -754,8 +754,8 @@ | Assert.cs:102:13:102:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:102:9:102:25 | [b (line 84): true] ... = ... | | | Assert.cs:102:17:102:20 | [b (line 84): true] null | Assert.cs:102:13:102:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:102:24:102:25 | [b (line 84): false] "" | Assert.cs:102:13:102:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:103:9:103:32 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:103:9:103:32 | [assertion success, b (line 84): false] call to method IsTrue | Assert.cs:104:9:104:36 | [b (line 84): false] ...; | | | Assert.cs:103:9:103:32 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:104:9:104:36 | [b (line 84): true] ...; | | | Assert.cs:103:9:103:33 | [b (line 84): false] ...; | Assert.cs:103:23:103:23 | [b (line 84): false] access to local variable s | | @@ -786,8 +786,8 @@ | Assert.cs:106:13:106:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:106:9:106:25 | [b (line 84): true] ... = ... | | | Assert.cs:106:17:106:20 | [b (line 84): true] null | Assert.cs:106:13:106:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:106:24:106:25 | [b (line 84): false] "" | Assert.cs:106:13:106:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:107:9:107:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:107:9:107:33 | [assertion success, b (line 84): false] call to method IsFalse | Assert.cs:108:9:108:36 | [b (line 84): false] ...; | | | Assert.cs:107:9:107:33 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:108:9:108:36 | [b (line 84): true] ...; | | | Assert.cs:107:9:107:34 | [b (line 84): false] ...; | Assert.cs:107:24:107:24 | [b (line 84): false] access to local variable s | | @@ -818,8 +818,8 @@ | Assert.cs:110:13:110:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:110:9:110:25 | [b (line 84): true] ... = ... | | | Assert.cs:110:17:110:20 | [b (line 84): true] null | Assert.cs:110:13:110:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:110:24:110:25 | [b (line 84): false] "" | Assert.cs:110:13:110:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): false] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:111:9:111:33 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:111:9:111:33 | [assertion success, b (line 84): false] call to method IsFalse | Assert.cs:112:9:112:36 | [b (line 84): false] ...; | | | Assert.cs:111:9:111:33 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:112:9:112:36 | [b (line 84): true] ...; | | | Assert.cs:111:9:111:34 | [b (line 84): false] ...; | Assert.cs:111:24:111:24 | [b (line 84): false] access to local variable s | | @@ -850,8 +850,8 @@ | Assert.cs:114:13:114:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:114:9:114:25 | [b (line 84): true] ... = ... | | | Assert.cs:114:17:114:20 | [b (line 84): true] null | Assert.cs:114:13:114:25 | [b (line 84): true] ... ? ... : ... | | | Assert.cs:114:24:114:25 | [b (line 84): false] "" | Assert.cs:114:13:114:25 | [b (line 84): false] ... ? ... : ... | | -| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | -| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): false] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | +| Assert.cs:115:9:115:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:115:9:115:37 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:116:9:116:36 | [b (line 84): true] ...; | | | Assert.cs:115:9:115:38 | [b (line 84): false] ...; | Assert.cs:115:23:115:23 | [b (line 84): false] access to local variable s | | | Assert.cs:115:9:115:38 | [b (line 84): true] ...; | Assert.cs:115:23:115:23 | [b (line 84): true] access to local variable s | | @@ -877,7 +877,7 @@ | Assert.cs:118:13:118:13 | [b (line 84): true] access to parameter b | Assert.cs:118:17:118:20 | [b (line 84): true] null | true | | Assert.cs:118:13:118:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:118:9:118:25 | [b (line 84): true] ... = ... | | | Assert.cs:118:17:118:20 | [b (line 84): true] null | Assert.cs:118:13:118:25 | [b (line 84): true] ... ? ... : ... | | -| Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:119:9:119:39 | [assertion failure, b (line 84): true] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:119:9:119:39 | [assertion success, b (line 84): true] call to method IsFalse | Assert.cs:120:9:120:36 | [b (line 84): true] ...; | | | Assert.cs:119:9:119:40 | [b (line 84): true] ...; | Assert.cs:119:24:119:24 | [b (line 84): true] access to local variable s | | | Assert.cs:119:24:119:24 | [b (line 84): true] access to local variable s | Assert.cs:119:29:119:32 | [b (line 84): true] null | | @@ -897,7 +897,7 @@ | Assert.cs:122:13:122:13 | [b (line 84): true] access to parameter b | Assert.cs:122:17:122:20 | [b (line 84): true] null | true | | Assert.cs:122:13:122:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:122:9:122:25 | [b (line 84): true] ... = ... | | | Assert.cs:122:17:122:20 | [b (line 84): true] null | Assert.cs:122:13:122:25 | [b (line 84): true] ... ? ... : ... | | -| Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:123:9:123:37 | [assertion failure, b (line 84): true] call to method IsTrue | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:123:9:123:37 | [assertion success, b (line 84): true] call to method IsTrue | Assert.cs:124:9:124:36 | [b (line 84): true] ...; | | | Assert.cs:123:9:123:38 | [b (line 84): true] ...; | Assert.cs:123:23:123:23 | [b (line 84): true] access to local variable s | | | Assert.cs:123:23:123:23 | [b (line 84): true] access to local variable s | Assert.cs:123:28:123:31 | [b (line 84): true] null | | @@ -916,7 +916,7 @@ | Assert.cs:126:13:126:13 | [b (line 84): true] access to parameter b | Assert.cs:126:17:126:20 | [b (line 84): true] null | true | | Assert.cs:126:13:126:25 | [b (line 84): true] ... ? ... : ... | Assert.cs:126:9:126:25 | [b (line 84): true] ... = ... | | | Assert.cs:126:17:126:20 | [b (line 84): true] null | Assert.cs:126:13:126:25 | [b (line 84): true] ... ? ... : ... | | -| Assert.cs:127:9:127:39 | [assertion failure] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception(AssertFailedException) | +| Assert.cs:127:9:127:39 | [assertion failure] call to method IsFalse | Assert.cs:84:10:84:12 | exit M12 (abnormal) | exception | | Assert.cs:127:9:127:39 | [assertion success] call to method IsFalse | Assert.cs:128:9:128:36 | ...; | | | Assert.cs:127:9:127:40 | [b (line 84): true] ...; | Assert.cs:127:24:127:24 | [b (line 84): true] access to local variable s | | | Assert.cs:127:24:127:24 | [b (line 84): true] access to local variable s | Assert.cs:127:29:127:32 | [b (line 84): true] null | | @@ -938,8 +938,8 @@ | Assert.cs:138:10:138:12 | exit M13 (abnormal) | Assert.cs:138:10:138:12 | exit M13 | | | Assert.cs:138:10:138:12 | exit M13 (normal) | Assert.cs:138:10:138:12 | exit M13 | | | Assert.cs:139:5:142:5 | {...} | Assert.cs:140:9:140:36 | ...; | | -| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | exception(Exception) | -| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | exception(Exception) | +| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | exception | +| Assert.cs:140:9:140:35 | [assertion failure] call to method AssertTrueFalse | Assert.cs:138:10:138:12 | exit M13 (abnormal) | exception | | Assert.cs:140:9:140:35 | [assertion success] call to method AssertTrueFalse | Assert.cs:141:9:141:15 | return ...; | | | Assert.cs:140:9:140:35 | this access | Assert.cs:140:25:140:26 | access to parameter b1 | | | Assert.cs:140:9:140:36 | ...; | Assert.cs:140:9:140:35 | this access | | @@ -1159,11 +1159,11 @@ | 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 | {...} | CompileTimeOperators.cs:32:13:32:21 | goto ...; | | -| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | goto(End) | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | goto(End) | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | | +| CompileTimeOperators.cs:32:13:32:21 | goto ...; | CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | goto | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:40:9:40:11 | End: | goto | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | | | CompileTimeOperators.cs:40:9:40:11 | End: | CompileTimeOperators.cs:40:14:40:38 | ...; | | | 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" | | @@ -1708,7 +1708,7 @@ | ExitMethods.cs:20:10:20:11 | enter M3 | ExitMethods.cs:21:5:24:5 | {...} | | | ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | ExitMethods.cs:20:10:20:11 | exit M3 | | | ExitMethods.cs:21:5:24:5 | {...} | ExitMethods.cs:22:9:22:26 | ...; | | -| ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | exception(ArgumentException), exception(Exception) | +| ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | ExitMethods.cs:20:10:20:11 | exit M3 (abnormal) | exception | | ExitMethods.cs:22:9:22:26 | ...; | ExitMethods.cs:22:21:22:24 | true | | | ExitMethods.cs:22:21:22:24 | true | ExitMethods.cs:22:9:22:25 | call to method ErrorAlways | | | ExitMethods.cs:26:10:26:11 | enter M4 | ExitMethods.cs:27:5:30:5 | {...} | | @@ -1728,8 +1728,8 @@ | ExitMethods.cs:39:5:52:5 | {...} | ExitMethods.cs:40:9:51:9 | try {...} ... | | | ExitMethods.cs:40:9:51:9 | try {...} ... | ExitMethods.cs:41:9:43:9 | {...} | | | ExitMethods.cs:41:9:43:9 | {...} | ExitMethods.cs:42:13:42:31 | ...; | | -| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: ArgumentException] catch (...) {...} | exception(ArgumentException) | -| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: Exception] catch (...) {...} | exception(Exception) | +| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: ArgumentException] catch (...) {...} | exception | +| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | [exception: Exception] catch (...) {...} | exception | | ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:25:42:29 | false | | | ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | | | ExitMethods.cs:44:9:47:9 | [exception: ArgumentException] catch (...) {...} | ExitMethods.cs:45:9:47:9 | {...} | match | @@ -1743,12 +1743,12 @@ | ExitMethods.cs:54:10:54:11 | enter M7 | ExitMethods.cs:55:5:58:5 | {...} | | | ExitMethods.cs:54:10:54:11 | exit M7 (abnormal) | ExitMethods.cs:54:10:54:11 | exit M7 | | | ExitMethods.cs:55:5:58:5 | {...} | ExitMethods.cs:56:9:56:23 | ...; | | -| ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | ExitMethods.cs:54:10:54:11 | exit M7 (abnormal) | exception(Exception) | +| ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | ExitMethods.cs:54:10:54:11 | exit M7 (abnormal) | exception | | ExitMethods.cs:56:9:56:23 | ...; | ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 | | | ExitMethods.cs:60:10:60:11 | enter M8 | ExitMethods.cs:61:5:64:5 | {...} | | | ExitMethods.cs:60:10:60:11 | exit M8 (abnormal) | ExitMethods.cs:60:10:60:11 | exit M8 | | | ExitMethods.cs:61:5:64:5 | {...} | ExitMethods.cs:62:9:62:23 | ...; | | -| ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | ExitMethods.cs:60:10:60:11 | exit M8 (abnormal) | exception(Exception) | +| ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | ExitMethods.cs:60:10:60:11 | exit M8 (abnormal) | exception | | ExitMethods.cs:62:9:62:23 | ...; | ExitMethods.cs:62:9:62:22 | call to method ErrorAlways3 | | | ExitMethods.cs:66:17:66:26 | enter ErrorMaybe | ExitMethods.cs:67:5:70:5 | {...} | | | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (abnormal) | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe | | @@ -1757,7 +1757,7 @@ | ExitMethods.cs:68:9:69:34 | if (...) ... | ExitMethods.cs:68:13:68:13 | access to parameter b | | | ExitMethods.cs:68:13:68:13 | access to parameter b | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (normal) | false | | ExitMethods.cs:68:13:68:13 | access to parameter b | ExitMethods.cs:69:19:69:33 | object creation of type Exception | true | -| ExitMethods.cs:69:13:69:34 | throw ...; | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (abnormal) | exception(Exception) | +| ExitMethods.cs:69:13:69:34 | throw ...; | ExitMethods.cs:66:17:66:26 | exit ErrorMaybe (abnormal) | exception | | ExitMethods.cs:69:19:69:33 | object creation of type Exception | ExitMethods.cs:69:13:69:34 | throw ...; | | | ExitMethods.cs:72:17:72:27 | enter ErrorAlways | ExitMethods.cs:73:5:78:5 | {...} | | | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | ExitMethods.cs:72:17:72:27 | exit ErrorAlways | | @@ -1765,19 +1765,19 @@ | ExitMethods.cs:74:9:77:45 | if (...) ... | ExitMethods.cs:74:13:74:13 | access to parameter b | | | ExitMethods.cs:74:13:74:13 | access to parameter b | ExitMethods.cs:75:19:75:33 | object creation of type Exception | true | | ExitMethods.cs:74:13:74:13 | access to parameter b | ExitMethods.cs:77:41:77:43 | "b" | false | -| ExitMethods.cs:75:13:75:34 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | exception(Exception) | +| ExitMethods.cs:75:13:75:34 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | exception | | ExitMethods.cs:75:19:75:33 | object creation of type Exception | ExitMethods.cs:75:13:75:34 | throw ...; | | -| ExitMethods.cs:77:13:77:45 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | exception(ArgumentException) | +| ExitMethods.cs:77:13:77:45 | throw ...; | ExitMethods.cs:72:17:72:27 | exit ErrorAlways (abnormal) | exception | | ExitMethods.cs:77:19:77:44 | object creation of type ArgumentException | ExitMethods.cs:77:13:77:45 | throw ...; | | | ExitMethods.cs:77:41:77:43 | "b" | ExitMethods.cs:77:19:77:44 | object creation of type ArgumentException | | | ExitMethods.cs:80:17:80:28 | enter ErrorAlways2 | ExitMethods.cs:81:5:83:5 | {...} | | | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 (abnormal) | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 | | | ExitMethods.cs:81:5:83:5 | {...} | ExitMethods.cs:82:15:82:29 | object creation of type Exception | | -| ExitMethods.cs:82:9:82:30 | throw ...; | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 (abnormal) | exception(Exception) | +| ExitMethods.cs:82:9:82:30 | throw ...; | ExitMethods.cs:80:17:80:28 | exit ErrorAlways2 (abnormal) | exception | | ExitMethods.cs:82:15:82:29 | object creation of type Exception | ExitMethods.cs:82:9:82:30 | throw ...; | | | ExitMethods.cs:85:17:85:28 | enter ErrorAlways3 | ExitMethods.cs:85:41:85:55 | object creation of type Exception | | | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 (abnormal) | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 | | -| ExitMethods.cs:85:35:85:55 | throw ... | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 (abnormal) | exception(Exception) | +| ExitMethods.cs:85:35:85:55 | throw ... | ExitMethods.cs:85:17:85:28 | exit ErrorAlways3 (abnormal) | exception | | ExitMethods.cs:85:41:85:55 | object creation of type Exception | ExitMethods.cs:85:35:85:55 | throw ... | | | ExitMethods.cs:87:10:87:13 | enter Exit | ExitMethods.cs:88:5:90:5 | {...} | | | ExitMethods.cs:87:10:87:13 | exit Exit (abnormal) | ExitMethods.cs:87:10:87:13 | exit Exit | | @@ -1813,7 +1813,7 @@ | ExitMethods.cs:112:29:112:29 | (...) ... | ExitMethods.cs:112:33:112:37 | access to parameter input | | | ExitMethods.cs:112:29:112:37 | ... / ... | ExitMethods.cs:112:16:112:76 | ... ? ... : ... | | | ExitMethods.cs:112:33:112:37 | access to parameter input | ExitMethods.cs:112:29:112:37 | ... / ... | | -| ExitMethods.cs:112:41:112:76 | throw ... | ExitMethods.cs:110:13:110:21 | exit ThrowExpr (abnormal) | exception(ArgumentException) | +| ExitMethods.cs:112:41:112:76 | throw ... | ExitMethods.cs:110:13:110:21 | exit ThrowExpr (abnormal) | exception | | ExitMethods.cs:112:47:112:76 | object creation of type ArgumentException | ExitMethods.cs:112:41:112:76 | throw ... | | | ExitMethods.cs:112:69:112:75 | "input" | ExitMethods.cs:112:47:112:76 | object creation of type ArgumentException | | | ExitMethods.cs:115:16:115:34 | enter ExtensionMethodCall | ExitMethods.cs:116:5:118:5 | {...} | | @@ -1830,26 +1830,26 @@ | ExitMethods.cs:120:17:120:32 | enter FailingAssertion | ExitMethods.cs:121:5:124:5 | {...} | | | ExitMethods.cs:120:17:120:32 | exit FailingAssertion (abnormal) | ExitMethods.cs:120:17:120:32 | exit FailingAssertion | | | ExitMethods.cs:121:5:124:5 | {...} | ExitMethods.cs:122:9:122:29 | ...; | | -| ExitMethods.cs:122:9:122:28 | [assertion failure] call to method IsTrue | ExitMethods.cs:120:17:120:32 | exit FailingAssertion (abnormal) | exception(AssertFailedException) | +| ExitMethods.cs:122:9:122:28 | [assertion failure] call to method IsTrue | ExitMethods.cs:120:17:120:32 | exit FailingAssertion (abnormal) | exception | | ExitMethods.cs:122:9:122:29 | ...; | ExitMethods.cs:122:23:122:27 | false | | | ExitMethods.cs:122:23:122:27 | false | ExitMethods.cs:122:9:122:28 | [assertion failure] call to method IsTrue | false | | ExitMethods.cs:126:17:126:33 | enter FailingAssertion2 | ExitMethods.cs:127:5:130:5 | {...} | | | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 (abnormal) | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 | | | ExitMethods.cs:127:5:130:5 | {...} | ExitMethods.cs:128:9:128:27 | ...; | | -| ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 (abnormal) | exception(AssertFailedException) | +| ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | ExitMethods.cs:126:17:126:33 | exit FailingAssertion2 (abnormal) | exception | | ExitMethods.cs:128:9:128:26 | this access | ExitMethods.cs:128:9:128:26 | call to method FailingAssertion | | | ExitMethods.cs:128:9:128:27 | ...; | ExitMethods.cs:128:9:128:26 | this access | | | ExitMethods.cs:132:10:132:20 | enter AssertFalse | ExitMethods.cs:132:48:132:48 | access to parameter b | | | ExitMethods.cs:132:10:132:20 | exit AssertFalse (abnormal) | ExitMethods.cs:132:10:132:20 | exit AssertFalse | | | ExitMethods.cs:132:10:132:20 | exit AssertFalse (normal) | ExitMethods.cs:132:10:132:20 | exit AssertFalse | | -| ExitMethods.cs:132:33:132:49 | [assertion failure] call to method IsFalse | ExitMethods.cs:132:10:132:20 | exit AssertFalse (abnormal) | exception(AssertFailedException) | +| ExitMethods.cs:132:33:132:49 | [assertion failure] call to method IsFalse | ExitMethods.cs:132:10:132:20 | exit AssertFalse (abnormal) | exception | | ExitMethods.cs:132:33:132:49 | [assertion success] call to method IsFalse | ExitMethods.cs:132:10:132:20 | exit AssertFalse (normal) | | | ExitMethods.cs:132:48:132:48 | access to parameter b | ExitMethods.cs:132:33:132:49 | [assertion failure] call to method IsFalse | true | | ExitMethods.cs:132:48:132:48 | access to parameter b | ExitMethods.cs:132:33:132:49 | [assertion success] call to method IsFalse | false | | ExitMethods.cs:134:17:134:33 | enter FailingAssertion3 | ExitMethods.cs:135:5:138:5 | {...} | | | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 (abnormal) | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 | | | ExitMethods.cs:135:5:138:5 | {...} | ExitMethods.cs:136:9:136:26 | ...; | | -| ExitMethods.cs:136:9:136:25 | [assertion failure] call to method AssertFalse | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 (abnormal) | exception(AssertFailedException) | +| ExitMethods.cs:136:9:136:25 | [assertion failure] call to method AssertFalse | ExitMethods.cs:134:17:134:33 | exit FailingAssertion3 (abnormal) | exception | | ExitMethods.cs:136:9:136:25 | this access | ExitMethods.cs:136:21:136:24 | true | | | ExitMethods.cs:136:9:136:26 | ...; | ExitMethods.cs:136:9:136:25 | this access | | | ExitMethods.cs:136:21:136:24 | true | ExitMethods.cs:136:9:136:25 | [assertion failure] call to method AssertFalse | true | @@ -1859,11 +1859,11 @@ | ExitMethods.cs:142:9:145:53 | if (...) ... | ExitMethods.cs:142:13:142:13 | access to parameter b | | | ExitMethods.cs:142:13:142:13 | access to parameter b | ExitMethods.cs:143:13:143:43 | ...; | true | | ExitMethods.cs:142:13:142:13 | access to parameter b | ExitMethods.cs:145:13:145:53 | ...; | false | -| ExitMethods.cs:143:13:143:42 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | exception(ArgumentException) | +| ExitMethods.cs:143:13:143:42 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | exception | | ExitMethods.cs:143:13:143:43 | ...; | ExitMethods.cs:143:41:143:41 | access to parameter e | | | ExitMethods.cs:143:41:143:41 | access to parameter e | ExitMethods.cs:143:13:143:42 | call to method Throw | | | ExitMethods.cs:145:13:145:44 | call to method Capture | ExitMethods.cs:145:13:145:52 | call to method Throw | | -| ExitMethods.cs:145:13:145:52 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | exception(Exception) | +| ExitMethods.cs:145:13:145:52 | call to method Throw | ExitMethods.cs:140:17:140:42 | exit ExceptionDispatchInfoThrow (abnormal) | exception | | ExitMethods.cs:145:13:145:53 | ...; | ExitMethods.cs:145:43:145:43 | access to parameter e | | | ExitMethods.cs:145:43:145:43 | access to parameter e | ExitMethods.cs:145:13:145:44 | call to method Capture | | | Extensions.cs:5:23:5:29 | enter ToInt32 | Extensions.cs:6:5:8:5 | {...} | | @@ -1912,18 +1912,18 @@ | 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 | {...} | Finally.cs:11:13:11:38 | ...; | | -| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | [finally: exception] {...} | exception | | Finally.cs:11:13:11:37 | call to method WriteLine | Finally.cs:14:9:16:9 | {...} | | | Finally.cs:11:13:11:38 | ...; | Finally.cs:11:31:11:36 | "Try1" | | | Finally.cs:11:31:11:36 | "Try1" | Finally.cs:11:13:11:37 | call to method WriteLine | | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:15:13:15:41 | [finally: exception] ...; | | | Finally.cs:14:9:16:9 | {...} | Finally.cs:15:13:15:41 | ...; | | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | exception(Exception) | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (abnormal) | exception | | Finally.cs:15:13:15:40 | call to method WriteLine | Finally.cs:7:10:7:11 | exit M1 (normal) | | | Finally.cs:15:13:15:41 | ...; | Finally.cs:15:31:15:39 | "Finally" | | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:15:31:15:39 | [finally: exception] "Finally" | | | Finally.cs:15:31:15:39 | "Finally" | Finally.cs:15:13:15:40 | call to method WriteLine | | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | | | Finally.cs:19:10:19:11 | enter M2 | Finally.cs:20:5:52:5 | {...} | | | Finally.cs:19:10:19:11 | exit M2 (abnormal) | Finally.cs:19:10:19:11 | exit M2 | | | Finally.cs:19:10:19:11 | exit M2 (normal) | Finally.cs:19:10:19:11 | exit M2 | | @@ -1931,7 +1931,7 @@ | Finally.cs:21:9:51:9 | try {...} ... | Finally.cs:22:9:25:9 | {...} | | | Finally.cs:22:9:25:9 | {...} | Finally.cs:23:13:23:38 | ...; | | | Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:24:13:24:19 | return ...; | | -| Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | exception(Exception) | +| Finally.cs:23:13:23:37 | call to method WriteLine | Finally.cs:26:9:29:9 | [exception: Exception] catch (...) {...} | exception | | Finally.cs:23:13:23:38 | ...; | Finally.cs:23:31:23:36 | "Try2" | | | Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | call to method WriteLine | | | Finally.cs:24:13:24:19 | return ...; | Finally.cs:49:9:51:9 | [finally: return] {...} | return | @@ -1940,7 +1940,7 @@ | Finally.cs:26:38:26:39 | [exception: Exception] IOException ex | Finally.cs:26:48:26:51 | [exception: Exception] true | | | Finally.cs:26:48:26:51 | [exception: Exception] true | Finally.cs:27:9:29:9 | {...} | true | | Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | throw ...; | | -| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | exception(IOException) | +| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | [finally: exception] {...} | exception | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | match | | Finally.cs:30:9:40:9 | [exception: Exception] catch (...) {...} | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | no-match | | Finally.cs:30:41:30:42 | [exception: Exception] ArgumentException ex | Finally.cs:31:9:40:9 | {...} | | @@ -1949,28 +1949,24 @@ | Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... | | | Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:34:21:34:24 | true | | | Finally.cs:34:21:34:24 | true | Finally.cs:34:27:34:32 | throw ...; | true | -| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | exception(ArgumentException) | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | | +| Finally.cs:34:27:34:32 | throw ...; | Finally.cs:37:13:39:13 | [finally: exception] {...} | exception | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | | +| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:49:9:51:9 | [finally: exception] {...} | exception | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:38:17:38:44 | [finally: exception] throw ...; | | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | | | Finally.cs:41:9:43:9 | [exception: Exception] catch (...) {...} | Finally.cs:42:9:43:9 | {...} | match | | Finally.cs:42:9:43:9 | {...} | Finally.cs:49:9:51:9 | {...} | | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:50:13:50:41 | [finally: exception] ...; | | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:50:13:50:41 | [finally: return] ...; | | | Finally.cs:49:9:51:9 | {...} | Finally.cs:50:13:50:41 | ...; | | -| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | exception(Exception) | -| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | exception(IOException) | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (abnormal) | exception | | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (normal) | return | | Finally.cs:50:13:50:40 | call to method WriteLine | Finally.cs:19:10:19:11 | exit M2 (normal) | | | Finally.cs:50:13:50:41 | ...; | Finally.cs:50:31:50:39 | "Finally" | | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:50:31:50:39 | [finally: exception] "Finally" | | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:50:31:50:39 | [finally: return] "Finally" | | | Finally.cs:50:31:50:39 | "Finally" | Finally.cs:50:13:50:40 | call to method WriteLine | | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | | | Finally.cs:54:10:54:11 | enter M3 | Finally.cs:55:5:72:5 | {...} | | | Finally.cs:54:10:54:11 | exit M3 (abnormal) | Finally.cs:54:10:54:11 | exit M3 | | @@ -1979,7 +1975,7 @@ | Finally.cs:56:9:71:9 | try {...} ... | Finally.cs:57:9:60:9 | {...} | | | Finally.cs:57:9:60:9 | {...} | Finally.cs:58:13:58:38 | ...; | | | Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:59:13:59:19 | return ...; | | -| Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | exception(Exception) | +| Finally.cs:58:13:58:37 | call to method WriteLine | Finally.cs:61:9:64:9 | [exception: Exception] catch (...) {...} | exception | | Finally.cs:58:13:58:38 | ...; | Finally.cs:58:31:58:36 | "Try3" | | | Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | call to method WriteLine | | | Finally.cs:59:13:59:19 | return ...; | Finally.cs:69:9:71:9 | [finally: return] {...} | return | @@ -1988,30 +1984,26 @@ | Finally.cs:61:38:61:39 | [exception: Exception] IOException ex | Finally.cs:61:48:61:51 | [exception: Exception] true | | | Finally.cs:61:48:61:51 | [exception: Exception] true | Finally.cs:62:9:64:9 | {...} | true | | Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | throw ...; | | -| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | exception(IOException) | +| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | [finally: exception] {...} | exception | | Finally.cs:65:9:67:9 | [exception: Exception] catch (...) {...} | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | match | | Finally.cs:65:26:65:26 | [exception: Exception] Exception e | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | | | Finally.cs:65:35:65:35 | [exception: Exception] access to local variable e | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | | | Finally.cs:65:35:65:43 | [exception: Exception] access to property Message | Finally.cs:65:48:65:51 | [exception: Exception] null | | | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:66:9:67:9 | {...} | true | -| Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | Finally.cs:69:9:71:9 | [finally: exception] {...} | exception | | Finally.cs:65:48:65:51 | [exception: Exception] null | Finally.cs:65:35:65:51 | [exception: Exception] ... != ... | | | Finally.cs:66:9:67:9 | {...} | Finally.cs:69:9:71:9 | {...} | | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:70:13:70:41 | [finally: exception] ...; | | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:70:13:70:41 | [finally: return] ...; | | | Finally.cs:69:9:71:9 | {...} | Finally.cs:70:13:70:41 | ...; | | -| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | exception(Exception) | -| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | exception(IOException) | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (abnormal) | exception | | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (normal) | return | | Finally.cs:70:13:70:40 | call to method WriteLine | Finally.cs:54:10:54:11 | exit M3 (normal) | | | Finally.cs:70:13:70:41 | ...; | Finally.cs:70:31:70:39 | "Finally" | | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:70:31:70:39 | [finally: exception] "Finally" | | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:70:31:70:39 | [finally: return] "Finally" | | | Finally.cs:70:31:70:39 | "Finally" | Finally.cs:70:13:70:40 | call to method WriteLine | | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | | | Finally.cs:74:10:74:11 | enter M4 | Finally.cs:75:5:101:5 | {...} | | | Finally.cs:74:10:74:11 | exit M4 (abnormal) | Finally.cs:74:10:74:11 | exit M4 | | @@ -2078,49 +2070,49 @@ | Finally.cs:92:30:92:30 | [finally: break] 3 | Finally.cs:92:25:92:30 | [finally: break] ... == ... | | | Finally.cs:92:30:92:30 | [finally: continue] 3 | Finally.cs:92:25:92:30 | [finally: continue] ... == ... | | | Finally.cs:92:30:92:30 | [finally: return] 3 | Finally.cs:92:25:92:30 | [finally: return] ... == ... | | -| Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:93:25:93:46 | [finally: return] throw ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:93:25:93:46 | throw ...; | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:93:25:93:46 | [finally: break] throw ...; | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | exception | +| Finally.cs:93:25:93:46 | [finally: continue] throw ...; | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | exception | +| Finally.cs:93:25:93:46 | [finally: return] throw ...; | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | exception | +| Finally.cs:93:25:93:46 | throw ...; | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | exception | | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: break] throw ...; | | -| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | exception | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: continue] throw ...; | | -| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | exception | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:93:25:93:46 | [finally: return] throw ...; | | -| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | exception | | Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:93:25:93:46 | throw ...; | | -| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | | +| Finally.cs:93:31:93:45 | object creation of type Exception | Finally.cs:96:17:98:17 | [finally(1): exception] {...} | exception | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally(1): exception] ...; | | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:97:21:97:24 | [finally: break] ...; | | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:97:21:97:24 | [finally: continue] ...; | | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:97:21:97:24 | [finally: return] ...; | | | Finally.cs:96:17:98:17 | {...} | Finally.cs:97:21:97:24 | ...; | | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:97:21:97:23 | [finally: break] ...-- | | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:97:21:97:23 | [finally: continue] ...-- | | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:97:21:97:23 | [finally: return] ...-- | | | Finally.cs:97:21:97:21 | access to local variable i | Finally.cs:97:21:97:23 | ...-- | | | Finally.cs:97:21:97:23 | ...-- | Finally.cs:77:16:77:16 | access to local variable i | | -| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception(Exception) | -| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception(Exception) | +| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception | +| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception | | Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:74:10:74:11 | exit M4 (normal) | break | -| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception(Exception) | +| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception | | Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:77:16:77:16 | access to local variable i | continue | -| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception(Exception) | +| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:74:10:74:11 | exit M4 (abnormal) | exception | | Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:74:10:74:11 | exit M4 (normal) | return | | Finally.cs:97:21:97:24 | ...; | Finally.cs:97:21:97:21 | access to local variable i | | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | | | Finally.cs:103:10:103:11 | enter M5 | Finally.cs:104:5:119:5 | {...} | | | Finally.cs:103:10:103:11 | exit M5 (abnormal) | Finally.cs:103:10:103:11 | exit M5 | | @@ -2130,147 +2122,97 @@ | Finally.cs:106:9:111:9 | {...} | Finally.cs:107:13:108:23 | if (...) ... | | | Finally.cs:107:13:108:23 | if (...) ... | Finally.cs:107:17:107:21 | this access | | | Finally.cs:107:17:107:21 | access to field Field | Finally.cs:107:17:107:28 | access to property Length | | -| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | exception(NullReferenceException) | +| Finally.cs:107:17:107:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:107:17:107:21 | this access | Finally.cs:107:17:107:21 | access to field Field | | | Finally.cs:107:17:107:28 | access to property Length | Finally.cs:107:33:107:33 | 0 | | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | exception(NullReferenceException) | +| Finally.cs:107:17:107:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:108:17:108:23 | return ...; | true | | Finally.cs:107:17:107:33 | ... == ... | Finally.cs:109:13:110:49 | if (...) ... | false | | Finally.cs:107:33:107:33 | 0 | Finally.cs:107:17:107:33 | ... == ... | | | Finally.cs:108:17:108:23 | return ...; | Finally.cs:113:9:118:9 | [finally: return] {...} | return | | Finally.cs:109:13:110:49 | if (...) ... | Finally.cs:109:17:109:21 | this access | | | Finally.cs:109:17:109:21 | access to field Field | Finally.cs:109:17:109:28 | access to property Length | | -| Finally.cs:109:17:109:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | exception(NullReferenceException) | +| Finally.cs:109:17:109:21 | access to field Field | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:109:17:109:21 | this access | Finally.cs:109:17:109:21 | access to field Field | | | Finally.cs:109:17:109:28 | access to property Length | Finally.cs:109:33:109:33 | 1 | | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | exception(NullReferenceException) | +| Finally.cs:109:17:109:28 | access to property Length | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | true | | Finally.cs:109:17:109:33 | ... == ... | Finally.cs:113:9:118:9 | {...} | false | | Finally.cs:109:33:109:33 | 1 | Finally.cs:109:17:109:33 | ... == ... | | -| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | exception(OutOfMemoryException) | +| Finally.cs:110:17:110:49 | throw ...; | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | | Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:110:17:110:49 | throw ...; | | -| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | | +| Finally.cs:110:23:110:48 | object creation of type OutOfMemoryException | Finally.cs:113:9:118:9 | [finally: exception] {...} | exception | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | | | Finally.cs:113:9:118:9 | {...} | Finally.cs:114:13:115:41 | if (...) ... | | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:114:19:114:23 | [finally: exception] this access | | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:114:19:114:23 | [finally: return] this access | | | Finally.cs:114:13:115:41 | if (...) ... | Finally.cs:114:19:114:23 | this access | | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | false | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | false | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | false | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | false | | Finally.cs:114:17:114:36 | [false] !... | Finally.cs:116:13:117:37 | if (...) ... | false | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:115:17:115:41 | [finally: exception] ...; | true | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:115:17:115:41 | [finally: return] ...; | true | | Finally.cs:114:17:114:36 | [true] !... | Finally.cs:115:17:115:41 | ...; | true | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:114:19:114:30 | [finally: exception] access to property Length | | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:114:19:114:23 | [finally: exception] access to field Field | | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:114:19:114:30 | [finally: return] access to property Length | | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:114:19:114:23 | [finally: return] access to field Field | | | Finally.cs:114:19:114:23 | access to field Field | Finally.cs:114:19:114:30 | access to property Length | | | Finally.cs:114:19:114:23 | this access | Finally.cs:114:19:114:23 | access to field Field | | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:114:35:114:35 | [finally: exception] 0 | | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:114:35:114:35 | [finally: return] 0 | | | Finally.cs:114:19:114:30 | access to property Length | Finally.cs:114:35:114:35 | 0 | | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [false] !... | true | | Finally.cs:114:19:114:35 | ... == ... | Finally.cs:114:17:114:36 | [true] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | false | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | true | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | false | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [false, finally: exception] !... | true | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:114:17:114:36 | [true, finally: exception] !... | false | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [false, finally: return] !... | true | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:114:17:114:36 | [true, finally: return] !... | false | | Finally.cs:114:35:114:35 | 0 | Finally.cs:114:19:114:35 | ... == ... | | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:114:19:114:35 | [finally: exception] ... == ... | | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:114:19:114:35 | [finally: return] ... == ... | | -| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | | -| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | | +| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | | | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | | | Finally.cs:115:17:115:40 | call to method WriteLine | Finally.cs:116:13:117:37 | if (...) ... | | | Finally.cs:115:17:115:41 | ...; | Finally.cs:115:35:115:39 | this access | | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:115:35:115:39 | [finally: exception] this access | | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:115:35:115:39 | [finally: return] this access | | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:115:35:115:39 | [finally: exception] access to field Field | | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:115:35:115:39 | [finally: return] access to field Field | | | Finally.cs:115:35:115:39 | access to field Field | Finally.cs:115:17:115:40 | call to method WriteLine | | | Finally.cs:115:35:115:39 | this access | Finally.cs:115:35:115:39 | access to field Field | | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:116:17:116:21 | [finally: exception] this access | | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:116:17:116:21 | [finally: return] this access | | | Finally.cs:116:13:117:37 | if (...) ... | Finally.cs:116:17:116:21 | this access | | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:116:17:116:28 | [finally: exception] access to property Length | | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:116:17:116:21 | [finally: exception] access to field Field | | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:116:17:116:28 | [finally: return] access to property Length | | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:116:17:116:21 | [finally: return] access to field Field | | | Finally.cs:116:17:116:21 | access to field Field | Finally.cs:116:17:116:28 | access to property Length | | | Finally.cs:116:17:116:21 | this access | Finally.cs:116:17:116:21 | access to field Field | | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:116:32:116:32 | [finally: exception] 0 | | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:116:32:116:32 | [finally: return] 0 | | | Finally.cs:116:17:116:28 | access to property Length | Finally.cs:116:32:116:32 | 0 | | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:103:10:103:11 | exit M5 (normal) | false | | Finally.cs:116:17:116:32 | ... > ... | Finally.cs:117:17:117:37 | ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(Exception) | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(NullReferenceException) | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | true | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(OutOfMemoryException) | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | true | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:117:17:117:37 | [finally: exception] ...; | true | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:103:10:103:11 | exit M5 (normal) | return | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:117:17:117:37 | [finally: return] ...; | true | | Finally.cs:116:32:116:32 | 0 | Finally.cs:116:17:116:32 | ... > ... | | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:116:17:116:32 | [finally: exception] ... > ... | | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:116:17:116:32 | [finally: return] ... > ... | | -| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(Exception) | -| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(NullReferenceException) | -| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception(OutOfMemoryException) | +| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (abnormal) | exception | | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (normal) | return | | Finally.cs:117:17:117:36 | call to method WriteLine | Finally.cs:103:10:103:11 | exit M5 (normal) | | | Finally.cs:117:17:117:37 | ...; | Finally.cs:117:35:117:35 | 1 | | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:117:35:117:35 | [finally: exception] 1 | | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:117:35:117:35 | [finally: return] 1 | | | Finally.cs:117:35:117:35 | 1 | Finally.cs:117:17:117:36 | call to method WriteLine | | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | | | Finally.cs:121:10:121:11 | enter M6 | Finally.cs:122:5:131:5 | {...} | | | Finally.cs:121:10:121:11 | exit M6 (normal) | Finally.cs:121:10:121:11 | exit M6 | | @@ -2288,18 +2230,18 @@ | Finally.cs:134:5:145:5 | {...} | Finally.cs:135:9:143:9 | try {...} ... | | | Finally.cs:135:9:143:9 | try {...} ... | Finally.cs:136:9:138:9 | {...} | | | Finally.cs:136:9:138:9 | {...} | Finally.cs:137:13:137:37 | ...; | | -| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | [finally: exception] {...} | exception | | Finally.cs:137:13:137:36 | call to method WriteLine | Finally.cs:140:9:143:9 | {...} | | | Finally.cs:137:13:137:37 | ...; | Finally.cs:137:31:137:35 | "Try" | | | Finally.cs:137:31:137:35 | "Try" | Finally.cs:137:13:137:36 | call to method WriteLine | | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:141:41:141:42 | [finally: exception] "" | | | Finally.cs:140:9:143:9 | {...} | Finally.cs:141:41:141:42 | "" | | -| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | exception(ArgumentException) | -| Finally.cs:141:13:141:44 | throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | exception(ArgumentException) | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | | +| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | exception | +| Finally.cs:141:13:141:44 | throw ...; | Finally.cs:133:10:133:11 | exit M7 (abnormal) | exception | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:141:13:141:44 | [finally: exception] throw ...; | | | Finally.cs:141:19:141:43 | object creation of type ArgumentException | Finally.cs:141:13:141:44 | throw ...; | | | Finally.cs:141:41:141:42 | "" | Finally.cs:141:19:141:43 | object creation of type ArgumentException | | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | | | Finally.cs:147:10:147:11 | enter M8 | Finally.cs:148:5:170:5 | {...} | | | Finally.cs:147:10:147:11 | exit M8 (abnormal) | Finally.cs:147:10:147:11 | exit M8 | | | Finally.cs:147:10:147:11 | exit M8 (normal) | Finally.cs:147:10:147:11 | exit M8 | | @@ -2311,129 +2253,89 @@ | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | true | | Finally.cs:151:17:151:28 | ... == ... | Finally.cs:155:9:169:9 | {...} | false | | Finally.cs:151:25:151:28 | null | Finally.cs:151:17:151:28 | ... == ... | | -| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | exception(ArgumentNullException) | +| Finally.cs:152:17:152:50 | throw ...; | Finally.cs:155:9:169:9 | [finally: exception] {...} | exception | | Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:152:17:152:50 | throw ...; | | -| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | | +| Finally.cs:152:23:152:49 | object creation of type ArgumentNullException | Finally.cs:155:9:169:9 | [finally: exception] {...} | exception | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | | | Finally.cs:155:9:169:9 | {...} | Finally.cs:156:13:168:13 | try {...} ... | | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:157:13:160:13 | [finally: exception] {...} | | | Finally.cs:156:13:168:13 | try {...} ... | Finally.cs:157:13:160:13 | {...} | | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | | | Finally.cs:157:13:160:13 | {...} | Finally.cs:158:17:159:45 | if (...) ... | | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | | | Finally.cs:158:17:159:45 | if (...) ... | Finally.cs:158:21:158:24 | access to parameter args | | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:158:21:158:31 | [finally: exception] access to property Length | | | Finally.cs:158:21:158:24 | access to parameter args | Finally.cs:158:21:158:31 | access to property Length | | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | exception(NullReferenceException) | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | exception(NullReferenceException) | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:158:36:158:36 | [finally: exception] 1 | | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | exception | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | exception | | Finally.cs:158:21:158:31 | access to property Length | Finally.cs:158:36:158:36 | 1 | | -| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | exception(NullReferenceException) | +| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception | +| Finally.cs:158:21:158:31 | access to property Length | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | exception | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:147:10:147:11 | exit M8 (normal) | false | | Finally.cs:158:21:158:36 | ... == ... | Finally.cs:159:41:159:43 | "1" | true | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(ArgumentNullException) | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | true | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(Exception) | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | true | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:159:41:159:43 | [finally: exception] "1" | true | | Finally.cs:158:36:158:36 | 1 | Finally.cs:158:21:158:36 | ... == ... | | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:159:21:159:45 | throw ...; | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | exception(Exception) | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | exception(Exception) | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:158:21:158:36 | [finally: exception] ... == ... | | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | exception | +| Finally.cs:159:21:159:45 | throw ...; | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:159:21:159:45 | [finally: exception] throw ...; | | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | exception | | Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:21:159:45 | throw ...; | | -| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception(Exception) | +| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | exception | | Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | | | Finally.cs:161:13:164:13 | [exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | match | | Finally.cs:161:13:164:13 | [exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | match | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | match | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | match | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | match | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | match | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | match | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | match | | Finally.cs:161:30:161:30 | [exception: Exception] Exception e | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | | | Finally.cs:161:30:161:30 | [exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | | | Finally.cs:161:39:161:39 | [exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | | | Finally.cs:161:39:161:39 | [exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | | | Finally.cs:161:39:161:47 | [exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [exception: Exception] "1" | | | Finally.cs:161:39:161:47 | [exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:162:13:164:13 | {...} | true | | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | Finally.cs:165:13:168:13 | catch {...} | false | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | {...} | true | | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | false | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | true | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | false | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | false | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:162:13:164:13 | [finally: exception] {...} | true | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:165:13:168:13 | [finally: exception] catch {...} | false | | Finally.cs:161:52:161:54 | [exception: Exception] "1" | Finally.cs:161:39:161:54 | [exception: Exception] ... == ... | | | Finally.cs:161:52:161:54 | [exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [exception: NullReferenceException] ... == ... | | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:163:17:163:43 | [finally: exception] ...; | | | Finally.cs:162:13:164:13 | {...} | Finally.cs:163:17:163:43 | ...; | | -| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(ArgumentNullException) | -| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(Exception) | +| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception | | Finally.cs:163:17:163:42 | call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (normal) | | | Finally.cs:163:17:163:43 | ...; | Finally.cs:163:35:163:38 | access to parameter args | | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:163:40:163:40 | [finally: exception] 0 | | | Finally.cs:163:35:163:38 | access to parameter args | Finally.cs:163:40:163:40 | 0 | | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | | | Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:17:163:42 | call to method WriteLine | | | Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element | | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:163:35:163:41 | [finally: exception] access to array element | | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:166:13:168:13 | [finally: exception] {...} | | | Finally.cs:165:13:168:13 | catch {...} | Finally.cs:166:13:168:13 | {...} | | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:167:17:167:38 | [finally: exception] ...; | | | Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; | | -| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(ArgumentNullException) | -| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception(Exception) | +| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (abnormal) | exception | | Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:147:10:147:11 | exit M8 (normal) | | | Finally.cs:167:17:167:38 | ...; | Finally.cs:167:35:167:36 | "" | | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:167:35:167:36 | [finally: exception] "" | | | 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:167:35:167:36 | [finally: exception] "" | Finally.cs:167:17:167:37 | [finally: 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 | | @@ -2455,64 +2357,45 @@ | Finally.cs:180:13:180:43 | if (...) ... | Finally.cs:180:17:180:18 | access to parameter b1 | | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | true | | Finally.cs:180:17:180:18 | access to parameter b1 | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | false | -| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | exception(ExceptionA) | +| Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | exception | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | | -| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | exception(Exception) | +| Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | exception | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(Exception) | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(ExceptionA) | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | -| Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | exception(ExceptionB) | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception(ExceptionB) | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception(ExceptionB) | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | true | +| Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | exception | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | | -| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | exception(Exception) | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception(Exception) | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception(Exception) | -| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(Exception) | +| Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | exception | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | exception | +| Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | match | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | match | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(Exception) | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(Exception) | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | match | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | true | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | Finally.cs:176:10:176:11 | exit M9 (normal) | false | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(ExceptionC) | -| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception(ExceptionC) | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | true | +| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:176:10:176:11 | exit M9 (abnormal) | exception | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:190:25:190:47 | [finally: exception] throw ...; | | | Finally.cs:195:10:195:12 | enter M10 | Finally.cs:196:5:214:5 | {...} | | | Finally.cs:195:10:195:12 | exit M10 (abnormal) | Finally.cs:195:10:195:12 | exit M10 | | | Finally.cs:195:10:195:12 | exit M10 (normal) | Finally.cs:195:10:195:12 | exit M10 | | @@ -2522,102 +2405,59 @@ | Finally.cs:199:13:199:43 | if (...) ... | Finally.cs:199:17:199:18 | access to parameter b1 | | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:199:27:199:42 | object creation of type ExceptionA | true | | Finally.cs:199:17:199:18 | access to parameter b1 | Finally.cs:202:9:212:9 | {...} | false | -| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | +| Finally.cs:199:21:199:43 | throw ...; | Finally.cs:202:9:212:9 | [finally: exception] {...} | exception | | Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:199:21:199:43 | throw ...; | | -| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | | +| Finally.cs:199:27:199:42 | object creation of type ExceptionA | Finally.cs:202:9:212:9 | [finally: exception] {...} | exception | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | | | Finally.cs:202:9:212:9 | {...} | Finally.cs:203:13:210:13 | try {...} ... | | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:204:13:206:13 | [finally: exception] {...} | | | Finally.cs:203:13:210:13 | try {...} ... | Finally.cs:204:13:206:13 | {...} | | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | | | Finally.cs:204:13:206:13 | {...} | Finally.cs:205:17:205:47 | if (...) ... | | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | | | Finally.cs:205:17:205:47 | if (...) ... | Finally.cs:205:21:205:22 | access to parameter b2 | | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | true | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | false | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | true | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | false | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | true | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:208:13:210:13 | [finally: exception] {...} | false | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:205:31:205:46 | object creation of type ExceptionB | true | | Finally.cs:205:21:205:22 | access to parameter b2 | Finally.cs:208:13:210:13 | {...} | false | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | exception(ExceptionB) | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | exception(ExceptionB) | -| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | exception(ExceptionB) | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | exception | +| Finally.cs:205:25:205:47 | throw ...; | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | exception | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:205:25:205:47 | [finally: exception] throw ...; | | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | exception | | Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:205:25:205:47 | throw ...; | | -| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | | +| Finally.cs:205:31:205:46 | object creation of type ExceptionB | Finally.cs:208:13:210:13 | [finally(1): exception] {...} | exception | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | | | Finally.cs:208:13:210:13 | {...} | Finally.cs:209:17:209:47 | if (...) ... | | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | | | Finally.cs:209:17:209:47 | if (...) ... | Finally.cs:209:21:209:22 | access to parameter b3 | | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(Exception) | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionB) | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(Exception) | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionB) | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | false | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(Exception) | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionB) | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | true | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | false | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | true | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:211:13:211:29 | [finally: exception] ...; | false | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:209:31:209:46 | object creation of type ExceptionC | true | | Finally.cs:209:21:209:22 | access to parameter b3 | Finally.cs:211:13:211:29 | ...; | false | -| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:25:209:47 | throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionC) | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | | +| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:25:209:47 | throw ...; | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:209:25:209:47 | [finally: exception] throw ...; | | | Finally.cs:209:31:209:46 | object creation of type ExceptionC | Finally.cs:209:25:209:47 | throw ...; | | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:211:26:211:28 | [finally: exception] "0" | | | Finally.cs:211:13:211:16 | this access | Finally.cs:211:26:211:28 | "0" | | | Finally.cs:211:13:211:28 | ... = ... | Finally.cs:213:9:213:25 | ...; | | -| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(Exception) | -| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception(ExceptionA) | +| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:195:10:195:12 | exit M10 (abnormal) | exception | | Finally.cs:211:13:211:29 | ...; | Finally.cs:211:13:211:16 | this access | | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:211:13:211:16 | [finally: exception] this access | | | Finally.cs:211:26:211:28 | "0" | Finally.cs:211:13:211:28 | ... = ... | | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:211:13:211:28 | [finally: exception] ... = ... | | | Finally.cs:213:9:213:12 | this access | Finally.cs:213:22:213:24 | "1" | | | Finally.cs:213:9:213:24 | ... = ... | Finally.cs:195:10:195:12 | exit M10 (normal) | | | Finally.cs:213:9:213:25 | ...; | Finally.cs:213:9:213:12 | this access | | @@ -2627,7 +2467,7 @@ | Finally.cs:217:5:231:5 | {...} | Finally.cs:218:9:229:9 | try {...} ... | | | Finally.cs:218:9:229:9 | try {...} ... | Finally.cs:219:9:221:9 | {...} | | | Finally.cs:219:9:221:9 | {...} | Finally.cs:220:13:220:37 | ...; | | -| Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:222:9:225:9 | catch {...} | exception(Exception) | +| Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:222:9:225:9 | catch {...} | exception | | Finally.cs:220:13:220:36 | call to method WriteLine | Finally.cs:227:9:229:9 | {...} | | | Finally.cs:220:13:220:37 | ...; | Finally.cs:220:31:220:35 | "Try" | | | Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | call to method WriteLine | | @@ -2654,88 +2494,55 @@ | Finally.cs:239:17:240:43 | if (...) ... | Finally.cs:239:21:239:22 | access to parameter b1 | | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:240:27:240:42 | object creation of type ExceptionA | true | | Finally.cs:239:21:239:22 | access to parameter b1 | Finally.cs:243:13:253:13 | {...} | false | -| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | +| Finally.cs:240:21:240:43 | throw ...; | Finally.cs:243:13:253:13 | [finally: exception] {...} | exception | | Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:240:21:240:43 | throw ...; | | -| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | | +| Finally.cs:240:27:240:42 | object creation of type ExceptionA | Finally.cs:243:13:253:13 | [finally: exception] {...} | exception | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | | | Finally.cs:243:13:253:13 | {...} | Finally.cs:244:17:252:17 | try {...} ... | | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:245:17:248:17 | [finally: exception] {...} | | | Finally.cs:244:17:252:17 | try {...} ... | Finally.cs:245:17:248:17 | {...} | | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | | | Finally.cs:245:17:248:17 | {...} | Finally.cs:246:21:247:47 | if (...) ... | | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | | | Finally.cs:246:21:247:47 | if (...) ... | Finally.cs:246:25:246:26 | access to parameter b2 | | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | true | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | false | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | true | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | false | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | true | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:250:17:252:17 | [finally: exception] {...} | false | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:247:31:247:46 | object creation of type ExceptionA | true | | Finally.cs:246:25:246:26 | access to parameter b2 | Finally.cs:250:17:252:17 | {...} | false | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | exception(Exception) | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | exception | +| Finally.cs:247:25:247:47 | throw ...; | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | exception | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:247:25:247:47 | [finally: exception] throw ...; | | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | exception | | Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:247:25:247:47 | throw ...; | | -| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | exception(Exception) | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | | +| Finally.cs:247:31:247:46 | object creation of type ExceptionA | Finally.cs:250:17:252:17 | [finally(1): exception] {...} | exception | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:251:21:251:55 | [finally(1): exception] ...; | | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:251:21:251:55 | [finally: exception] ...; | | | Finally.cs:250:17:252:17 | {...} | Finally.cs:251:21:251:55 | ...; | | -| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | exception(ExceptionA) | +| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception] {...} | exception | +| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception] {...} | exception | +| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception] {...} | exception | | Finally.cs:251:21:251:54 | call to method WriteLine | Finally.cs:254:13:254:45 | ...; | | | Finally.cs:251:21:251:55 | ...; | Finally.cs:251:39:251:53 | "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | | | Finally.cs:251:39:251:53 | "Inner finally" | Finally.cs:251:21:251:54 | call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | | -| Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | | +| Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | [finally: exception] {...} | exception | | Finally.cs:254:13:254:44 | call to method WriteLine | Finally.cs:257:9:259:9 | {...} | | | Finally.cs:254:13:254:45 | ...; | Finally.cs:254:31:254:43 | "Mid finally" | | | Finally.cs:254:31:254:43 | "Mid finally" | Finally.cs:254:13:254:44 | call to method WriteLine | | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:258:13:258:47 | [finally: exception] ...; | | | Finally.cs:257:9:259:9 | {...} | Finally.cs:258:13:258:47 | ...; | | -| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | exception(Exception) | -| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | exception(ExceptionA) | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (abnormal) | exception | | Finally.cs:258:13:258:46 | call to method WriteLine | Finally.cs:260:9:260:34 | ...; | | | Finally.cs:258:13:258:47 | ...; | Finally.cs:258:31:258:45 | "Outer finally" | | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | | | Finally.cs:258:31:258:45 | "Outer finally" | Finally.cs:258:13:258:46 | call to method WriteLine | | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | | | Finally.cs:260:9:260:33 | call to method WriteLine | Finally.cs:233:10:233:12 | exit M12 (normal) | | | Finally.cs:260:9:260:34 | ...; | Finally.cs:260:27:260:32 | "Done" | | | Finally.cs:260:27:260:32 | "Done" | Finally.cs:260:9:260:33 | call to method WriteLine | | @@ -2745,28 +2552,28 @@ | Finally.cs:264:5:274:5 | {...} | Finally.cs:265:9:273:9 | try {...} ... | | | Finally.cs:265:9:273:9 | try {...} ... | Finally.cs:266:9:268:9 | {...} | | | Finally.cs:266:9:268:9 | {...} | Finally.cs:267:13:267:35 | ...; | | -| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | exception(Exception) | +| Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | [finally: exception] {...} | exception | | Finally.cs:267:13:267:34 | call to method WriteLine | Finally.cs:270:9:273:9 | {...} | | | Finally.cs:267:13:267:35 | ...; | Finally.cs:267:31:267:33 | "1" | | | Finally.cs:267:31:267:33 | "1" | Finally.cs:267:13:267:34 | call to method WriteLine | | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:271:13:271:35 | [finally: exception] ...; | | | Finally.cs:270:9:273:9 | {...} | Finally.cs:271:13:271:35 | ...; | | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:272:13:272:19 | [finally: exception] ...; | | | Finally.cs:271:13:271:34 | call to method WriteLine | Finally.cs:272:13:272:19 | ...; | | | Finally.cs:271:13:271:35 | ...; | Finally.cs:271:31:271:33 | "3" | | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:271:31:271:33 | [finally: exception] "3" | | | Finally.cs:271:31:271:33 | "3" | Finally.cs:271:13:271:34 | call to method WriteLine | | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:272:18:272:18 | [finally: exception] 3 | | | Finally.cs:272:13:272:13 | access to parameter i | Finally.cs:272:18:272:18 | 3 | | | Finally.cs:272:13:272:18 | ... + ... | Finally.cs:272:13:272:18 | ... = ... | | | Finally.cs:272:13:272:18 | ... = ... | Finally.cs:263:10:263:12 | exit M13 (normal) | | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | exception(Exception) | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:272:13:272:18 | [finally: exception] ... = ... | | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:263:10:263:12 | exit M13 (abnormal) | exception | | Finally.cs:272:13:272:19 | ...; | Finally.cs:272:13:272:13 | access to parameter i | | -| 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:13:272:19 | [finally: exception] ...; | Finally.cs:272:13:272:13 | [finally: 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)] ... + ... | | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:272:13:272:18 | [finally: 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 | | @@ -3159,7 +2966,7 @@ | LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | LoopUnrolling.cs:51:13:51:23 | goto ...; | | | LoopUnrolling.cs:50:16:50:36 | ...; | LoopUnrolling.cs:50:34:50:34 | access to local variable x | | | LoopUnrolling.cs:50:34:50:34 | access to local variable x | LoopUnrolling.cs:50:16:50:35 | call to method WriteLine | | -| LoopUnrolling.cs:51:13:51:23 | goto ...; | LoopUnrolling.cs:50:9:50:13 | Label: | goto(Label) | +| LoopUnrolling.cs:51:13:51:23 | goto ...; | LoopUnrolling.cs:50:9:50:13 | Label: | goto | | LoopUnrolling.cs:55:10:55:11 | enter M7 | LoopUnrolling.cs:56:5:65:5 | {...} | | | LoopUnrolling.cs:55:10:55:11 | exit M7 (normal) | LoopUnrolling.cs:55:10:55:11 | exit M7 | | | LoopUnrolling.cs:56:5:65:5 | {...} | LoopUnrolling.cs:57:9:57:48 | ... ...; | | @@ -3261,27 +3068,27 @@ | MultiImplementationA.cs:6:22:6:31 | enter get_P1 | MultiImplementationB.cs:3:22:3:22 | 0 | | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | | | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (normal) | MultiImplementationA.cs:6:22:6:31 | exit get_P1 | | -| MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:6:22:6:31 | throw ... | MultiImplementationA.cs:6:22:6:31 | exit get_P1 (abnormal) | exception | | MultiImplementationA.cs:6:28:6:31 | null | MultiImplementationA.cs:6:22:6:31 | throw ... | | | MultiImplementationA.cs:7:21:7:23 | enter get_P2 | MultiImplementationA.cs:7:25:7:39 | {...} | | | MultiImplementationA.cs:7:21:7:23 | enter get_P2 | MultiImplementationB.cs:4:25:4:37 | {...} | | | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | MultiImplementationA.cs:7:21:7:23 | exit get_P2 | | | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (normal) | MultiImplementationA.cs:7:21:7:23 | exit get_P2 | | | MultiImplementationA.cs:7:25:7:39 | {...} | MultiImplementationA.cs:7:33:7:36 | null | | -| MultiImplementationA.cs:7:27:7:37 | throw ...; | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:7:27:7:37 | throw ...; | MultiImplementationA.cs:7:21:7:23 | exit get_P2 (abnormal) | exception | | MultiImplementationA.cs:7:33:7:36 | null | MultiImplementationA.cs:7:27:7:37 | throw ...; | | | MultiImplementationA.cs:7:41:7:43 | enter set_P2 | MultiImplementationA.cs:7:45:7:59 | {...} | | | MultiImplementationA.cs:7:41:7:43 | enter set_P2 | MultiImplementationB.cs:4:43:4:45 | {...} | | | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | MultiImplementationA.cs:7:41:7:43 | exit set_P2 | | | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (normal) | MultiImplementationA.cs:7:41:7:43 | exit set_P2 | | | MultiImplementationA.cs:7:45:7:59 | {...} | MultiImplementationA.cs:7:53:7:56 | null | | -| MultiImplementationA.cs:7:47:7:57 | throw ...; | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:7:47:7:57 | throw ...; | MultiImplementationA.cs:7:41:7:43 | exit set_P2 (abnormal) | exception | | MultiImplementationA.cs:7:53:7:56 | null | MultiImplementationA.cs:7:47:7:57 | throw ...; | | | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationA.cs:8:29:8:32 | null | | | MultiImplementationA.cs:8:16:8:16 | enter M | MultiImplementationB.cs:5:23:5:23 | 2 | | | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | MultiImplementationA.cs:8:16:8:16 | exit M | | | MultiImplementationA.cs:8:16:8:16 | exit M (normal) | MultiImplementationA.cs:8:16:8:16 | exit M | | -| MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:8:23:8:32 | throw ... | MultiImplementationA.cs:8:16:8:16 | exit M (abnormal) | exception | | MultiImplementationA.cs:8:29:8:32 | null | MultiImplementationA.cs:8:23:8:32 | throw ... | | | MultiImplementationA.cs:13:16:13:16 | this access | MultiImplementationA.cs:13:20:13:20 | 0 | | | MultiImplementationA.cs:13:16:13:20 | ... = ... | MultiImplementationA.cs:24:16:24:16 | this access | | @@ -3347,7 +3154,7 @@ | MultiImplementationA.cs:28:7:28:8 | {...} | MultiImplementationA.cs:28:7:28:8 | exit C3 (normal) | | | 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:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:30:28:30:37 | throw ... | MultiImplementationA.cs:30:21:30:23 | exit get_P3 (abnormal) | exception | | 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 | | @@ -3359,12 +3166,12 @@ | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | MultiImplementationA.cs:36:9:36:10 | exit M1 | | | MultiImplementationA.cs:36:9:36:10 | exit M1 (normal) | MultiImplementationA.cs:36:9:36:10 | exit M1 | | | MultiImplementationA.cs:36:14:36:28 | {...} | MultiImplementationA.cs:36:22:36:25 | null | | -| MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | exception(NullReferenceException) | +| MultiImplementationA.cs:36:16:36:26 | throw ...; | MultiImplementationA.cs:36:9:36:10 | exit M1 (abnormal) | exception | | MultiImplementationA.cs:36:22:36:25 | null | MultiImplementationA.cs:36:16:36:26 | throw ...; | | | MultiImplementationA.cs:37:9:37:10 | enter M2 | MultiImplementationA.cs:37:14:37:28 | {...} | | | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | MultiImplementationA.cs:37:9:37:10 | exit M2 | | | 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) | exception(NullReferenceException) | +| MultiImplementationA.cs:37:16:37:26 | throw ...; | MultiImplementationA.cs:37:9:37:10 | exit M2 (abnormal) | exception | | 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 | {...} | MultiImplementationA.cs:4:7:4:8 | exit C1 (normal) | | @@ -3377,29 +3184,29 @@ | MultiImplementationB.cs:11:16:11:16 | this access | MultiImplementationB.cs:11:20:11:20 | 1 | | | MultiImplementationB.cs:11:16:11:20 | ... = ... | MultiImplementationB.cs:22:16:22:16 | this access | | | MultiImplementationB.cs:11:20:11:20 | 1 | MultiImplementationB.cs:11:16:11:20 | ... = ... | | -| MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationA.cs:14:31:14:31 | exit get_Item (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:12:31:12:40 | throw ... | MultiImplementationA.cs:14:31:14:31 | exit get_Item (abnormal) | exception | | MultiImplementationB.cs:12:37:12:40 | null | MultiImplementationB.cs:12:31:12:40 | throw ... | | | MultiImplementationB.cs:13:40:13:54 | {...} | MultiImplementationB.cs:13:48:13:51 | null | | -| MultiImplementationB.cs:13:42:13:52 | throw ...; | MultiImplementationA.cs:15:36:15:38 | exit get_Item (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:13:42:13:52 | throw ...; | MultiImplementationA.cs:15:36:15:38 | exit get_Item (abnormal) | exception | | MultiImplementationB.cs:13:48:13:51 | null | MultiImplementationB.cs:13:42:13:52 | throw ...; | | | MultiImplementationB.cs:13:60:13:62 | {...} | MultiImplementationA.cs:15:54:15:56 | exit set_Item (normal) | | | MultiImplementationB.cs:15:5:17:5 | {...} | MultiImplementationB.cs:16:9:16:31 | M2(...) | | | MultiImplementationB.cs:16:9:16:31 | M2(...) | MultiImplementationA.cs:16:17:16:18 | exit M1 (normal) | | | MultiImplementationB.cs:16:9:16:31 | enter M2 | MultiImplementationB.cs:16:27:16:30 | null | | | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | MultiImplementationB.cs:16:9:16:31 | exit M2 | | -| MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:16:21:16:30 | throw ... | MultiImplementationB.cs:16:9:16:31 | exit M2 (abnormal) | exception | | MultiImplementationB.cs:16:27:16:30 | null | MultiImplementationB.cs:16:21:16:30 | throw ... | | | MultiImplementationB.cs:18:12:18:13 | call to constructor Object | MultiImplementationB.cs:11:16:11:16 | this access | | | MultiImplementationB.cs:18:22:18:36 | {...} | MultiImplementationB.cs:18:30:18:33 | null | | -| MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:18:24:18:34 | throw ...; | MultiImplementationA.cs:20:12:20:13 | exit C2 (abnormal) | exception | | MultiImplementationB.cs:18:30:18:33 | null | MultiImplementationB.cs:18:24:18:34 | throw ...; | | | MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | MultiImplementationB.cs:19:27:19:29 | {...} | | | MultiImplementationB.cs:19:24:19:24 | 1 | MultiImplementationB.cs:19:19:19:22 | call to constructor C2 | | | MultiImplementationB.cs:19:27:19:29 | {...} | MultiImplementationA.cs:21:12:21:13 | exit C2 (normal) | | | MultiImplementationB.cs:20:11:20:25 | {...} | MultiImplementationB.cs:20:19:20:22 | null | | -| MultiImplementationB.cs:20:13:20:23 | throw ...; | MultiImplementationA.cs:22:6:22:7 | exit ~C2 (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:20:13:20:23 | throw ...; | MultiImplementationA.cs:22:6:22:7 | exit ~C2 (abnormal) | exception | | MultiImplementationB.cs:20:19:20:22 | null | MultiImplementationB.cs:20:13:20:23 | throw ...; | | -| MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | exception(NullReferenceException) | +| MultiImplementationB.cs:21:50:21:59 | throw ... | MultiImplementationA.cs:23:28:23:35 | exit implicit conversion (abnormal) | exception | | MultiImplementationB.cs:21:56:21:59 | null | MultiImplementationB.cs:21:50:21:59 | throw ... | | | MultiImplementationB.cs:22:16:22:16 | access to property P | MultiImplementationB.cs:22:32:22:34 | ... = ... | | | MultiImplementationB.cs:22:16:22:16 | this access | MultiImplementationB.cs:22:34:22:34 | 1 | | @@ -3772,7 +3579,7 @@ | PostDominance.cs:19:13:19:21 | [true] ... is ... | PostDominance.cs:20:45:20:53 | nameof(...) | true | | PostDominance.cs:19:18:19:21 | null | PostDominance.cs:19:13:19:21 | [false] ... is ... | no-match | | PostDominance.cs:19:18:19:21 | null | PostDominance.cs:19:13:19:21 | [true] ... is ... | match | -| PostDominance.cs:20:13:20:55 | throw ...; | PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | exception(ArgumentNullException) | +| PostDominance.cs:20:13:20:55 | throw ...; | PostDominance.cs:17:10:17:11 | exit M3 (abnormal) | exception | | PostDominance.cs:20:19:20:54 | object creation of type ArgumentNullException | PostDominance.cs:20:13:20:55 | throw ...; | | | PostDominance.cs:20:45:20:53 | nameof(...) | PostDominance.cs:20:19:20:54 | object creation of type ArgumentNullException | | | PostDominance.cs:21:9:21:28 | call to method WriteLine | PostDominance.cs:17:10:17:11 | exit M3 (normal) | | @@ -3867,12 +3674,12 @@ | Switch.cs:16:13:16:19 | case ...: | Switch.cs:16:18:16:18 | 0 | | | Switch.cs:16:18:16:18 | 0 | Switch.cs:17:23:17:37 | object creation of type Exception | match | | Switch.cs:16:18:16:18 | 0 | Switch.cs:18:13:18:22 | case ...: | no-match | -| Switch.cs:17:17:17:38 | throw ...; | Switch.cs:10:10:10:11 | exit M2 (abnormal) | exception(Exception) | +| Switch.cs:17:17:17:38 | throw ...; | Switch.cs:10:10:10:11 | exit M2 (abnormal) | exception | | Switch.cs:17:23:17:37 | object creation of type Exception | Switch.cs:17:17:17:38 | throw ...; | | | Switch.cs:18:13:18:22 | case ...: | Switch.cs:18:18:18:21 | null | | | Switch.cs:18:18:18:21 | null | Switch.cs:19:17:19:29 | goto default; | match | | Switch.cs:18:18:18:21 | null | Switch.cs:20:13:20:23 | case ...: | no-match | -| Switch.cs:19:17:19:29 | goto default; | Switch.cs:30:13:30:20 | default: | goto(default) | +| Switch.cs:19:17:19:29 | goto default; | Switch.cs:30:13:30:20 | default: | goto | | Switch.cs:20:13:20:23 | case ...: | Switch.cs:20:18:20:22 | Int32 i | | | Switch.cs:20:18:20:22 | Int32 i | Switch.cs:21:17:22:27 | if (...) ... | match | | Switch.cs:20:18:20:22 | Int32 i | Switch.cs:24:13:24:56 | case ...: | no-match | @@ -3882,7 +3689,7 @@ | Switch.cs:21:21:21:29 | ... == ... | Switch.cs:23:27:23:27 | 0 | false | | Switch.cs:21:26:21:29 | null | Switch.cs:21:21:21:29 | ... == ... | | | Switch.cs:22:21:22:27 | return ...; | Switch.cs:10:10:10:11 | exit M2 (normal) | return | -| Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:16:13:16:19 | case ...: | goto(0) | +| Switch.cs:23:17:23:28 | goto case ...; | Switch.cs:16:13:16:19 | case ...: | goto | | Switch.cs:23:27:23:27 | 0 | Switch.cs:23:17:23:28 | goto case ...; | | | Switch.cs:24:13:24:56 | case ...: | Switch.cs:24:18:24:25 | String s | | | Switch.cs:24:18:24:25 | String s | Switch.cs:24:32:24:32 | access to local variable s | match | @@ -3905,16 +3712,16 @@ | Switch.cs:27:13:27:39 | case ...: | Switch.cs:27:18:27:25 | Double d | | | Switch.cs:27:18:27:25 | Double d | Switch.cs:27:32:27:38 | call to method Throw | match | | Switch.cs:27:18:27:25 | Double d | Switch.cs:30:13:30:20 | default: | no-match | -| Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | exit M2 (abnormal) | exception(Exception) | +| Switch.cs:27:32:27:38 | call to method Throw | Switch.cs:10:10:10:11 | exit M2 (abnormal) | exception | | Switch.cs:28:13:28:17 | Label: | Switch.cs:29:17:29:23 | return ...; | | | Switch.cs:29:17:29:23 | return ...; | Switch.cs:10:10:10:11 | exit M2 (normal) | return | | Switch.cs:30:13:30:20 | default: | Switch.cs:31:17:31:27 | goto ...; | | -| Switch.cs:31:17:31:27 | goto ...; | Switch.cs:28:13:28:17 | Label: | goto(Label) | +| Switch.cs:31:17:31:27 | goto ...; | Switch.cs:28:13:28:17 | Label: | goto | | Switch.cs:35:10:35:11 | enter M3 | Switch.cs:36:5:42:5 | {...} | | | Switch.cs:35:10:35:11 | exit M3 (abnormal) | Switch.cs:35:10:35:11 | exit M3 | | | Switch.cs:36:5:42:5 | {...} | Switch.cs:37:9:41:9 | switch (...) {...} | | | Switch.cs:37:9:41:9 | switch (...) {...} | Switch.cs:37:17:37:23 | call to method Throw | | -| Switch.cs:37:17:37:23 | call to method Throw | Switch.cs:35:10:35:11 | exit M3 (abnormal) | exception(Exception) | +| Switch.cs:37:17:37:23 | call to method Throw | Switch.cs:35:10:35:11 | exit M3 (abnormal) | exception | | Switch.cs:44:10:44:11 | enter M4 | Switch.cs:45:5:53:5 | {...} | | | Switch.cs:44:10:44:11 | exit M4 (normal) | Switch.cs:44:10:44:11 | exit M4 | | | Switch.cs:45:5:53:5 | {...} | Switch.cs:46:9:52:9 | switch (...) {...} | | @@ -4013,7 +3820,7 @@ | Switch.cs:108:17:108:17 | 1 | Switch.cs:108:16:108:17 | -... | | | Switch.cs:111:17:111:21 | enter Throw | Switch.cs:111:34:111:48 | object creation of type Exception | | | Switch.cs:111:17:111:21 | exit Throw (abnormal) | Switch.cs:111:17:111:21 | exit Throw | | -| Switch.cs:111:28:111:48 | throw ... | Switch.cs:111:17:111:21 | exit Throw (abnormal) | exception(Exception) | +| Switch.cs:111:28:111:48 | throw ... | Switch.cs:111:17:111:21 | exit Throw (abnormal) | exception | | Switch.cs:111:34:111:48 | object creation of type Exception | Switch.cs:111:28:111:48 | throw ... | | | Switch.cs:113:9:113:11 | enter M10 | Switch.cs:114:5:121:5 | {...} | | | Switch.cs:113:9:113:11 | exit M10 (normal) | Switch.cs:113:9:113:11 | exit M10 | | @@ -4126,7 +3933,7 @@ | Switch.cs:156:28:156:31 | true | Switch.cs:156:41:156:45 | false | no-match | | Switch.cs:156:28:156:38 | ... => ... | Switch.cs:156:17:156:54 | ... switch { ... } | | | Switch.cs:156:36:156:38 | "a" | Switch.cs:156:28:156:38 | ... => ... | | -| Switch.cs:156:41:156:45 | false | Switch.cs:154:10:154:12 | exit M15 (abnormal) | exception(InvalidOperationException) | +| Switch.cs:156:41:156:45 | false | Switch.cs:154:10:154:12 | exit M15 (abnormal) | exception | | Switch.cs:156:41:156:45 | false | Switch.cs:156:50:156:52 | "b" | match | | Switch.cs:156:41:156:52 | ... => ... | Switch.cs:156:17:156:54 | ... switch { ... } | | | Switch.cs:156:50:156:52 | "b" | Switch.cs:156:41:156:52 | ... => ... | | @@ -4361,7 +4168,7 @@ | cflow.cs:42:17:42:38 | call to method WriteLine | cflow.cs:43:27:43:27 | 2 | | | cflow.cs:42:17:42:39 | ...; | cflow.cs:42:35:42:37 | "1" | | | cflow.cs:42:35:42:37 | "1" | cflow.cs:42:17:42:38 | call to method WriteLine | | -| cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:44:13:44:19 | case ...: | goto(2) | +| cflow.cs:43:17:43:28 | goto case ...; | cflow.cs:44:13:44:19 | case ...: | goto | | cflow.cs:43:27:43:27 | 2 | cflow.cs:43:17:43:28 | goto case ...; | | | cflow.cs:44:13:44:19 | case ...: | cflow.cs:44:18:44:18 | 2 | | | cflow.cs:44:18:44:18 | 2 | cflow.cs:45:17:45:39 | ...; | match | @@ -4369,7 +4176,7 @@ | cflow.cs:45:17:45:38 | call to method WriteLine | cflow.cs:46:27:46:27 | 1 | | | cflow.cs:45:17:45:39 | ...; | cflow.cs:45:35:45:37 | "2" | | | cflow.cs:45:35:45:37 | "2" | cflow.cs:45:17:45:38 | call to method WriteLine | | -| cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:41:13:41:19 | case ...: | goto(1) | +| cflow.cs:46:17:46:28 | goto case ...; | cflow.cs:41:13:41:19 | case ...: | goto | | cflow.cs:46:27:46:27 | 1 | cflow.cs:46:17:46:28 | goto case ...; | | | cflow.cs:47:13:47:19 | case ...: | cflow.cs:47:18:47:18 | 3 | | | cflow.cs:47:18:47:18 | 3 | cflow.cs:48:17:48:39 | ...; | match | @@ -4407,7 +4214,7 @@ | cflow.cs:63:23:63:33 | ... == ... | cflow.cs:63:21:63:34 | [false] !... | true | | cflow.cs:63:23:63:33 | ... == ... | cflow.cs:63:21:63:34 | [true] !... | false | | cflow.cs:63:32:63:33 | "" | cflow.cs:63:23:63:33 | ... == ... | | -| cflow.cs:64:21:64:55 | throw ...; | cflow.cs:37:17:37:22 | exit Switch (abnormal) | exception(NullReferenceException) | +| cflow.cs:64:21:64:55 | throw ...; | cflow.cs:37:17:37:22 | exit Switch (abnormal) | exception | | cflow.cs:64:27:64:54 | object creation of type NullReferenceException | cflow.cs:64:21:64:55 | throw ...; | | | cflow.cs:65:17:65:22 | break; | cflow.cs:67:16:67:16 | access to parameter a | break | | cflow.cs:67:9:67:17 | return ...; | cflow.cs:37:17:37:22 | exit Switch (normal) | return | @@ -4462,7 +4269,7 @@ | cflow.cs:92:13:92:27 | call to method Equals | cflow.cs:94:9:94:29 | ...; | false | | cflow.cs:92:20:92:20 | access to parameter s | cflow.cs:92:23:92:26 | null | | | cflow.cs:92:23:92:26 | null | cflow.cs:92:13:92:27 | call to method Equals | | -| cflow.cs:93:13:93:49 | throw ...; | cflow.cs:90:18:90:19 | exit M3 (abnormal) | exception(ArgumentNullException) | +| cflow.cs:93:13:93:49 | throw ...; | cflow.cs:90:18:90:19 | exit M3 (abnormal) | exception | | cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | cflow.cs:93:13:93:49 | throw ...; | | | cflow.cs:93:45:93:47 | "s" | cflow.cs:93:19:93:48 | object creation of type ArgumentNullException | | | cflow.cs:94:9:94:28 | call to method WriteLine | cflow.cs:96:9:97:55 | if (...) ... | | @@ -4777,7 +4584,7 @@ | cflow.cs:200:61:200:61 | access to local variable b | cflow.cs:200:40:200:61 | [true] ... && ... | true | | cflow.cs:201:9:205:9 | {...} | cflow.cs:202:13:204:13 | {...} | | | cflow.cs:202:13:204:13 | {...} | cflow.cs:203:23:203:37 | object creation of type Exception | | -| cflow.cs:203:17:203:38 | throw ...; | cflow.cs:193:10:193:17 | exit Booleans (abnormal) | exception(Exception) | +| cflow.cs:203:17:203:38 | throw ...; | cflow.cs:193:10:193:17 | exit Booleans (abnormal) | exception | | cflow.cs:203:23:203:37 | object creation of type Exception | cflow.cs:203:17:203:38 | throw ...; | | | cflow.cs:208:10:208:11 | enter Do | cflow.cs:209:5:222:5 | {...} | | | cflow.cs:208:10:208:11 | exit Do (normal) | cflow.cs:208:10:208:11 | exit Do | | @@ -4873,7 +4680,7 @@ | cflow.cs:244:13:244:28 | ... > ... | cflow.cs:244:31:244:41 | goto ...; | true | | cflow.cs:244:13:244:28 | ... > ... | cflow.cs:246:9:258:9 | switch (...) {...} | false | | cflow.cs:244:28:244:28 | 0 | cflow.cs:244:13:244:28 | ... > ... | | -| cflow.cs:244:31:244:41 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto(Label) | +| cflow.cs:244:31:244:41 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto | | cflow.cs:246:9:258:9 | switch (...) {...} | cflow.cs:246:17:246:21 | this access | | | cflow.cs:246:17:246:21 | access to field Field | cflow.cs:246:17:246:28 | access to property Length | | | cflow.cs:246:17:246:21 | this access | cflow.cs:246:17:246:21 | access to field Field | | @@ -4883,7 +4690,7 @@ | cflow.cs:248:13:248:19 | case ...: | cflow.cs:248:18:248:18 | 0 | | | cflow.cs:248:18:248:18 | 0 | cflow.cs:249:17:249:29 | goto default; | match | | cflow.cs:248:18:248:18 | 0 | cflow.cs:250:13:250:19 | case ...: | no-match | -| cflow.cs:249:17:249:29 | goto default; | cflow.cs:255:13:255:20 | default: | goto(default) | +| cflow.cs:249:17:249:29 | goto default; | cflow.cs:255:13:255:20 | default: | goto | | cflow.cs:250:13:250:19 | case ...: | cflow.cs:250:18:250:18 | 1 | | | cflow.cs:250:18:250:18 | 1 | cflow.cs:251:17:251:37 | ...; | match | | cflow.cs:250:18:250:18 | 1 | cflow.cs:253:13:253:19 | case ...: | no-match | @@ -4894,7 +4701,7 @@ | cflow.cs:253:13:253:19 | case ...: | cflow.cs:253:18:253:18 | 2 | | | cflow.cs:253:18:253:18 | 2 | cflow.cs:254:17:254:27 | goto ...; | match | | cflow.cs:253:18:253:18 | 2 | cflow.cs:255:13:255:20 | default: | no-match | -| cflow.cs:254:17:254:27 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto(Label) | +| cflow.cs:254:17:254:27 | goto ...; | cflow.cs:242:5:242:9 | Label: | goto | | cflow.cs:255:13:255:20 | default: | cflow.cs:256:17:256:37 | ...; | | | cflow.cs:256:17:256:36 | call to method WriteLine | cflow.cs:257:17:257:22 | break; | | | cflow.cs:256:17:256:37 | ...; | cflow.cs:256:35:256:35 | 0 | | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected index 7c5a64b7155e..81c154386797 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/csharp/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -508,65 +508,45 @@ booleanNode | Finally.cs:180:21:180:43 | [b1 (line 176): true] throw ...; | b1 (line 176): true | | Finally.cs:180:27:180:42 | [b1 (line 176): true] object creation of type ExceptionA | b1 (line 176): true | | Finally.cs:183:9:192:9 | [b1 (line 176): false] {...} | b1 (line 176): false | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | b1 (line 176): true | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | b1 (line 176): true | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true | | Finally.cs:184:13:191:13 | [b1 (line 176): false] try {...} ... | b1 (line 176): false | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | b1 (line 176): true | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | b1 (line 176): true | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | b1 (line 176): true | | Finally.cs:185:13:187:13 | [b1 (line 176): false] {...} | b1 (line 176): false | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | b1 (line 176): true | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | b1 (line 176): true | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true | | Finally.cs:186:17:186:47 | [b1 (line 176): false] if (...) ... | b1 (line 176): false | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | b1 (line 176): true | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | b1 (line 176): true | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | b1 (line 176): true | | Finally.cs:186:21:186:22 | [b1 (line 176): false] access to parameter b2 | b1 (line 176): false | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | b1 (line 176): true | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | b1 (line 176): true | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | b1 (line 176): false | | Finally.cs:186:25:186:47 | [b1 (line 176): false, b2 (line 176): true] throw ...; | b2 (line 176): true | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | b1 (line 176): true | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | b2 (line 176): true | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | b1 (line 176): true | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | b2 (line 176): true | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | b1 (line 176): true | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | b2 (line 176): true | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): false | | Finally.cs:186:31:186:46 | [b1 (line 176): false, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): true | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): true | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b1 (line 176): true | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | b2 (line 176): true | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b1 (line 176): false | | Finally.cs:188:13:191:13 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b1 (line 176): false | | Finally.cs:188:13:191:13 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b1 (line 176): true | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | b2 (line 176): true | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b1 (line 176): false | | Finally.cs:188:38:188:39 | [exception: Exception, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b1 (line 176): false | | Finally.cs:188:38:188:39 | [exception: ExceptionB, b1 (line 176): false, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b1 (line 176): true | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | b2 (line 176): true | | Finally.cs:189:13:191:13 | [b1 (line 176): false] {...} | b1 (line 176): false | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | b1 (line 176): true | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | b1 (line 176): true | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | b1 (line 176): true | | Finally.cs:190:17:190:47 | [b1 (line 176): false] if (...) ... | b1 (line 176): false | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | b1 (line 176): true | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | b1 (line 176): true | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | b1 (line 176): true | | Finally.cs:190:21:190:22 | [b1 (line 176): false] access to parameter b1 | b1 (line 176): false | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | b1 (line 176): true | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | b1 (line 176): true | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | b1 (line 176): true | | LoopUnrolling.cs:58:9:64:9 | [b (line 55): false] foreach (... ... in ...) ... | b (line 55): false | | LoopUnrolling.cs:58:9:64:9 | [b (line 55): true] foreach (... ... in ...) ... | b (line 55): true | | LoopUnrolling.cs:58:22:58:22 | [b (line 55): false] String x | b (line 55): false | @@ -614,41 +594,33 @@ finallyNode | BreakInTry.cs:67:21:67:31 | [finally: return] ... == ... | BreakInTry.cs:58:9:70:9 | try {...} ... | | BreakInTry.cs:67:28:67:31 | [finally: return] null | BreakInTry.cs:58:9:70:9 | try {...} ... | | BreakInTry.cs:68:21:68:26 | [finally: return] break; | BreakInTry.cs:58:9:70:9 | try {...} ... | -| CompileTimeOperators.cs:36:9:38:9 | [finally: goto(End)] {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | -| CompileTimeOperators.cs:37:13:37:40 | [finally: goto(End)] call to method WriteLine | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | -| CompileTimeOperators.cs:37:13:37:41 | [finally: goto(End)] ...; | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | -| CompileTimeOperators.cs:37:31:37:39 | [finally: goto(End)] "Finally" | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | -| Finally.cs:14:9:16:9 | [finally: exception(Exception)] {...} | Finally.cs:9:9:16:9 | try {...} ... | -| Finally.cs:15:13:15:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:9:9:16:9 | try {...} ... | -| Finally.cs:15:13:15:41 | [finally: exception(Exception)] ...; | Finally.cs:9:9:16:9 | try {...} ... | -| Finally.cs:15:31:15:39 | [finally: exception(Exception)] "Finally" | Finally.cs:9:9:16:9 | try {...} ... | -| Finally.cs:37:13:39:13 | [finally: exception(ArgumentException)] {...} | Finally.cs:32:13:39:13 | try {...} ... | -| Finally.cs:38:17:38:44 | [finally: exception(ArgumentException)] throw ...; | Finally.cs:32:13:39:13 | try {...} ... | -| Finally.cs:38:23:38:43 | [finally: exception(ArgumentException)] object creation of type Exception | Finally.cs:32:13:39:13 | try {...} ... | -| Finally.cs:38:37:38:42 | [finally: exception(ArgumentException)] "Boo!" | Finally.cs:32:13:39:13 | try {...} ... | -| Finally.cs:49:9:51:9 | [finally: exception(Exception)] {...} | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:49:9:51:9 | [finally: exception(IOException)] {...} | Finally.cs:21:9:51:9 | try {...} ... | +| CompileTimeOperators.cs:36:9:38:9 | [finally: goto] {...} | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | +| CompileTimeOperators.cs:37:13:37:40 | [finally: goto] call to method WriteLine | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | +| CompileTimeOperators.cs:37:13:37:41 | [finally: goto] ...; | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | +| CompileTimeOperators.cs:37:31:37:39 | [finally: goto] "Finally" | CompileTimeOperators.cs:30:9:38:9 | try {...} ... | +| Finally.cs:14:9:16:9 | [finally: exception] {...} | Finally.cs:9:9:16:9 | try {...} ... | +| Finally.cs:15:13:15:40 | [finally: exception] call to method WriteLine | Finally.cs:9:9:16:9 | try {...} ... | +| Finally.cs:15:13:15:41 | [finally: exception] ...; | Finally.cs:9:9:16:9 | try {...} ... | +| Finally.cs:15:31:15:39 | [finally: exception] "Finally" | Finally.cs:9:9:16:9 | try {...} ... | +| Finally.cs:37:13:39:13 | [finally: exception] {...} | Finally.cs:32:13:39:13 | try {...} ... | +| Finally.cs:38:17:38:44 | [finally: exception] throw ...; | Finally.cs:32:13:39:13 | try {...} ... | +| Finally.cs:38:23:38:43 | [finally: exception] object creation of type Exception | Finally.cs:32:13:39:13 | try {...} ... | +| Finally.cs:38:37:38:42 | [finally: exception] "Boo!" | Finally.cs:32:13:39:13 | try {...} ... | +| Finally.cs:49:9:51:9 | [finally: exception] {...} | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:49:9:51:9 | [finally: return] {...} | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:13:50:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:13:50:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... | +| Finally.cs:50:13:50:40 | [finally: exception] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:50:13:50:40 | [finally: return] call to method WriteLine | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:13:50:41 | [finally: exception(Exception)] ...; | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:13:50:41 | [finally: exception(IOException)] ...; | Finally.cs:21:9:51:9 | try {...} ... | +| Finally.cs:50:13:50:41 | [finally: exception] ...; | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:50:13:50:41 | [finally: return] ...; | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:31:50:39 | [finally: exception(Exception)] "Finally" | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:50:31:50:39 | [finally: exception(IOException)] "Finally" | Finally.cs:21:9:51:9 | try {...} ... | +| Finally.cs:50:31:50:39 | [finally: exception] "Finally" | Finally.cs:21:9:51:9 | try {...} ... | | Finally.cs:50:31:50:39 | [finally: return] "Finally" | Finally.cs:21:9:51:9 | try {...} ... | -| Finally.cs:69:9:71:9 | [finally: exception(Exception)] {...} | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:69:9:71:9 | [finally: exception(IOException)] {...} | Finally.cs:56:9:71:9 | try {...} ... | +| Finally.cs:69:9:71:9 | [finally: exception] {...} | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:69:9:71:9 | [finally: return] {...} | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:13:70:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:13:70:40 | [finally: exception(IOException)] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... | +| Finally.cs:70:13:70:40 | [finally: exception] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:70:13:70:40 | [finally: return] call to method WriteLine | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:13:70:41 | [finally: exception(Exception)] ...; | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:13:70:41 | [finally: exception(IOException)] ...; | Finally.cs:56:9:71:9 | try {...} ... | +| Finally.cs:70:13:70:41 | [finally: exception] ...; | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:70:13:70:41 | [finally: return] ...; | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:31:70:39 | [finally: exception(Exception)] "Finally" | Finally.cs:56:9:71:9 | try {...} ... | -| Finally.cs:70:31:70:39 | [finally: exception(IOException)] "Finally" | Finally.cs:56:9:71:9 | try {...} ... | +| Finally.cs:70:31:70:39 | [finally: exception] "Finally" | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:70:31:70:39 | [finally: return] "Finally" | Finally.cs:56:9:71:9 | try {...} ... | | Finally.cs:89:13:99:13 | [finally: break] {...} | Finally.cs:79:13:99:13 | try {...} ... | | Finally.cs:89:13:99:13 | [finally: continue] {...} | Finally.cs:79:13:99:13 | try {...} ... | @@ -677,351 +649,190 @@ finallyNode | Finally.cs:93:31:93:45 | [finally: break] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... | | Finally.cs:93:31:93:45 | [finally: continue] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... | | Finally.cs:93:31:93:45 | [finally: return] object creation of type Exception | Finally.cs:79:13:99:13 | try {...} ... | -| Finally.cs:96:17:98:17 | [finally(1): exception(Exception)] {...} | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception(Exception)] {...} | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:96:17:98:17 | [finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:96:17:98:17 | [finally: break, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:96:17:98:17 | [finally: break] {...} | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception(Exception)] {...} | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:96:17:98:17 | [finally: continue, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:96:17:98:17 | [finally: continue] {...} | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception(Exception)] {...} | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:96:17:98:17 | [finally: return, finally(1): exception] {...} | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:96:17:98:17 | [finally: return] {...} | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:21 | [finally(1): exception(Exception)] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception(Exception)] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:21 | [finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:21 | [finally: break, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:21 | [finally: break] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception(Exception)] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:21 | [finally: continue, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:21 | [finally: continue] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception(Exception)] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:21 | [finally: return, finally(1): exception] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:21 | [finally: return] access to local variable i | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:23 | [finally(1): exception(Exception)] ...-- | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception(Exception)] ...-- | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:23 | [finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:23 | [finally: break, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:23 | [finally: break] ...-- | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception(Exception)] ...-- | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:23 | [finally: continue, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:23 | [finally: continue] ...-- | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception(Exception)] ...-- | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:23 | [finally: return, finally(1): exception] ...-- | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:23 | [finally: return] ...-- | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:24 | [finally(1): exception(Exception)] ...; | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception(Exception)] ...; | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:24 | [finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:24 | [finally: break, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:24 | [finally: break] ...; | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception(Exception)] ...; | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:24 | [finally: continue, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:24 | [finally: continue] ...; | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception(Exception)] ...; | Finally.cs:90:17:98:17 | try {...} ... | +| Finally.cs:97:21:97:24 | [finally: return, finally(1): exception] ...; | Finally.cs:90:17:98:17 | try {...} ... | | Finally.cs:97:21:97:24 | [finally: return] ...; | Finally.cs:90:17:98:17 | try {...} ... | -| Finally.cs:113:9:118:9 | [finally: exception(Exception)] {...} | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:113:9:118:9 | [finally: exception(NullReferenceException)] {...} | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:113:9:118:9 | [finally: exception(OutOfMemoryException)] {...} | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:113:9:118:9 | [finally: exception] {...} | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:113:9:118:9 | [finally: return] {...} | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:13:115:41 | [finally: exception(Exception)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:13:115:41 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:13:115:41 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:13:115:41 | [finally: exception] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:13:115:41 | [finally: return] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [false, finally: exception(Exception)] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [false, finally: exception(NullReferenceException)] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [false, finally: exception(OutOfMemoryException)] !... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:17:114:36 | [false, finally: exception] !... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:17:114:36 | [false, finally: return] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [true, finally: exception(Exception)] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [true, finally: exception(NullReferenceException)] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:17:114:36 | [true, finally: exception(OutOfMemoryException)] !... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:17:114:36 | [true, finally: exception] !... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:17:114:36 | [true, finally: return] !... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(Exception)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(NullReferenceException)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:23 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:19:114:23 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:19:114:23 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:19:114:23 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:19:114:23 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:30 | [finally: exception(Exception)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:30 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:30 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:19:114:30 | [finally: exception] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:19:114:30 | [finally: return] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:35 | [finally: exception(Exception)] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:35 | [finally: exception(NullReferenceException)] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:19:114:35 | [finally: exception(OutOfMemoryException)] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:19:114:35 | [finally: exception] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:19:114:35 | [finally: return] ... == ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:35:114:35 | [finally: exception(Exception)] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:35:114:35 | [finally: exception(NullReferenceException)] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:114:35:114:35 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:114:35:114:35 | [finally: exception] 0 | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:114:35:114:35 | [finally: return] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:40 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:40 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:40 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:115:17:115:40 | [finally: exception] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:115:17:115:40 | [finally: return] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:41 | [finally: exception(Exception)] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:41 | [finally: exception(NullReferenceException)] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:17:115:41 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:115:17:115:41 | [finally: exception] ...; | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:115:17:115:41 | [finally: return] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(Exception)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(NullReferenceException)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:115:35:115:39 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:115:35:115:39 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:115:35:115:39 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:115:35:115:39 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:115:35:115:39 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:13:117:37 | [finally: exception(Exception)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:13:117:37 | [finally: exception(NullReferenceException)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:13:117:37 | [finally: exception(OutOfMemoryException)] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:13:117:37 | [finally: exception] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:13:117:37 | [finally: return] if (...) ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(Exception)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(NullReferenceException)] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:21 | [finally: exception(OutOfMemoryException)] this access | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:17:116:21 | [finally: exception] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:17:116:21 | [finally: exception] this access | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:17:116:21 | [finally: return] access to field Field | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:17:116:21 | [finally: return] this access | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:28 | [finally: exception(Exception)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:28 | [finally: exception(NullReferenceException)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:28 | [finally: exception(OutOfMemoryException)] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:17:116:28 | [finally: exception] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:17:116:28 | [finally: return] access to property Length | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:32 | [finally: exception(Exception)] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:32 | [finally: exception(NullReferenceException)] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:17:116:32 | [finally: exception(OutOfMemoryException)] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:17:116:32 | [finally: exception] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:17:116:32 | [finally: return] ... > ... | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:32:116:32 | [finally: exception(Exception)] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:32:116:32 | [finally: exception(NullReferenceException)] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:116:32:116:32 | [finally: exception(OutOfMemoryException)] 0 | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:116:32:116:32 | [finally: exception] 0 | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:116:32:116:32 | [finally: return] 0 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:36 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:36 | [finally: exception(NullReferenceException)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:36 | [finally: exception(OutOfMemoryException)] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:117:17:117:36 | [finally: exception] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:117:17:117:36 | [finally: return] call to method WriteLine | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:37 | [finally: exception(Exception)] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:37 | [finally: exception(NullReferenceException)] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:17:117:37 | [finally: exception(OutOfMemoryException)] ...; | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:117:17:117:37 | [finally: exception] ...; | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:117:17:117:37 | [finally: return] ...; | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:35:117:35 | [finally: exception(Exception)] 1 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:35:117:35 | [finally: exception(NullReferenceException)] 1 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:117:35:117:35 | [finally: exception(OutOfMemoryException)] 1 | Finally.cs:105:9:118:9 | try {...} ... | +| Finally.cs:117:35:117:35 | [finally: exception] 1 | Finally.cs:105:9:118:9 | try {...} ... | | Finally.cs:117:35:117:35 | [finally: return] 1 | Finally.cs:105:9:118:9 | try {...} ... | -| Finally.cs:140:9:143:9 | [finally: exception(Exception)] {...} | Finally.cs:135:9:143:9 | try {...} ... | -| Finally.cs:141:13:141:44 | [finally: exception(Exception)] throw ...; | Finally.cs:135:9:143:9 | try {...} ... | -| Finally.cs:141:19:141:43 | [finally: exception(Exception)] object creation of type ArgumentException | Finally.cs:135:9:143:9 | try {...} ... | -| Finally.cs:141:41:141:42 | [finally: exception(Exception)] "" | Finally.cs:135:9:143:9 | try {...} ... | -| Finally.cs:155:9:169:9 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:155:9:169:9 | [finally: exception(Exception)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:156:13:168:13 | [finally: exception(ArgumentNullException)] try {...} ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:156:13:168:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:157:13:160:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:157:13:160:13 | [finally: exception(Exception)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:17:159:45 | [finally: exception(ArgumentNullException)] if (...) ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:17:159:45 | [finally: exception(Exception)] if (...) ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:24 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:24 | [finally: exception(Exception)] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:31 | [finally: exception(ArgumentNullException)] access to property Length | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:31 | [finally: exception(Exception)] access to property Length | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:36 | [finally: exception(ArgumentNullException)] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:21:158:36 | [finally: exception(Exception)] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:36:158:36 | [finally: exception(ArgumentNullException)] 1 | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:158:36:158:36 | [finally: exception(Exception)] 1 | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:21:159:45 | [finally: exception(ArgumentNullException)] throw ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:21:159:45 | [finally: exception(Exception)] throw ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:27:159:44 | [finally: exception(ArgumentNullException)] object creation of type Exception | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:27:159:44 | [finally: exception(Exception)] object creation of type Exception | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:41:159:43 | [finally: exception(ArgumentNullException)] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:159:41:159:43 | [finally: exception(Exception)] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: Exception] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:13:164:13 | [finally: exception(ArgumentNullException), exception: NullReferenceException] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: Exception] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:13:164:13 | [finally: exception(Exception), exception: NullReferenceException] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: Exception] Exception e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:30:161:30 | [finally: exception(ArgumentNullException), exception: NullReferenceException] Exception e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: Exception] Exception e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:30:161:30 | [finally: exception(Exception), exception: NullReferenceException] Exception e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: Exception] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:39 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: Exception] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:39 | [finally: exception(Exception), exception: NullReferenceException] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: Exception] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:47 | [finally: exception(ArgumentNullException), exception: NullReferenceException] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: Exception] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:47 | [finally: exception(Exception), exception: NullReferenceException] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: Exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: Exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:39:161:54 | [finally: exception(Exception), exception: NullReferenceException] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: Exception] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:52:161:54 | [finally: exception(ArgumentNullException), exception: NullReferenceException] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: Exception] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:161:52:161:54 | [finally: exception(Exception), exception: NullReferenceException] "1" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:162:13:164:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:162:13:164:13 | [finally: exception(Exception)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:17:163:42 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:17:163:42 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:17:163:43 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:17:163:43 | [finally: exception(Exception)] ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:35:163:38 | [finally: exception(ArgumentNullException)] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:35:163:38 | [finally: exception(Exception)] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:35:163:41 | [finally: exception(ArgumentNullException)] access to array element | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:35:163:41 | [finally: exception(Exception)] access to array element | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:40:163:40 | [finally: exception(ArgumentNullException)] 0 | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:163:40:163:40 | [finally: exception(Exception)] 0 | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:165:13:168:13 | [finally: exception(ArgumentNullException)] catch {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:165:13:168:13 | [finally: exception(Exception)] catch {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:166:13:168:13 | [finally: exception(ArgumentNullException)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:166:13:168:13 | [finally: exception(Exception)] {...} | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:17:167:37 | [finally: exception(ArgumentNullException)] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:17:167:37 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:17:167:38 | [finally: exception(ArgumentNullException)] ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:17:167:38 | [finally: exception(Exception)] ...; | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:35:167:36 | [finally: exception(ArgumentNullException)] "" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:167:35:167:36 | [finally: exception(Exception)] "" | Finally.cs:149:9:169:9 | try {...} ... | -| Finally.cs:183:9:192:9 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:183:9:192:9 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:184:13:191:13 | [finally: exception(Exception), b1 (line 176): true] try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:184:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:185:13:187:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:185:13:187:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:17:186:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:17:186:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:21:186:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:21:186:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:25:186:47 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:25:186:47 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:31:186:46 | [finally: exception(Exception), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:186:31:186:46 | [finally: exception(ExceptionA), b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:13:191:13 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:13:191:13 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:38:188:39 | [finally: exception(Exception), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:188:38:188:39 | [finally: exception(ExceptionA), exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:189:13:191:13 | [finally: exception(Exception), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:189:13:191:13 | [finally: exception(ExceptionA), b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:17:190:47 | [finally: exception(Exception), b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:17:190:47 | [finally: exception(ExceptionA), b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:21:190:22 | [finally: exception(Exception), b1 (line 176): true] access to parameter b1 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:21:190:22 | [finally: exception(ExceptionA), b1 (line 176): true] access to parameter b1 | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:25:190:47 | [finally: exception(Exception)] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:25:190:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:31:190:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:190:31:190:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:178:9:192:9 | try {...} ... | -| Finally.cs:202:9:212:9 | [finally: exception(Exception)] {...} | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:202:9:212:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:203:13:210:13 | [finally: exception(Exception)] try {...} ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:203:13:210:13 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:204:13:206:13 | [finally: exception(Exception)] {...} | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:204:13:206:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:17:205:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:17:205:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:21:205:22 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:21:205:22 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:25:205:47 | [finally: exception(Exception)] throw ...; | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:25:205:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:31:205:46 | [finally: exception(Exception)] object creation of type ExceptionB | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:205:31:205:46 | [finally: exception(ExceptionA)] object creation of type ExceptionB | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally(1): exception(Exception)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally(1): exception(ExceptionB)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception), finally(1): exception(ExceptionB)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(Exception)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:208:13:210:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally(1): exception(Exception)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:17:209:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally(1): exception(Exception)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(Exception)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(Exception)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:21:209:22 | [finally: exception(ExceptionA)] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally(1): exception(Exception)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally(1): exception(ExceptionB)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(Exception)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(Exception), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(Exception)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(Exception)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:25:209:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(Exception), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(Exception)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(Exception)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA), finally(1): exception(ExceptionB)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:209:31:209:46 | [finally: exception(ExceptionA)] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | -| Finally.cs:211:13:211:16 | [finally: exception(Exception)] this access | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:16 | [finally: exception(ExceptionA)] this access | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:28 | [finally: exception(Exception)] ... = ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:28 | [finally: exception(ExceptionA)] ... = ... | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:29 | [finally: exception(Exception)] ...; | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:13:211:29 | [finally: exception(ExceptionA)] ...; | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:26:211:28 | [finally: exception(Exception)] "0" | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:211:26:211:28 | [finally: exception(ExceptionA)] "0" | Finally.cs:197:9:212:9 | try {...} ... | -| Finally.cs:243:13:253:13 | [finally: exception(Exception)] {...} | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:243:13:253:13 | [finally: exception(ExceptionA)] {...} | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:244:17:252:17 | [finally: exception(Exception)] try {...} ... | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:244:17:252:17 | [finally: exception(ExceptionA)] try {...} ... | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:245:17:248:17 | [finally: exception(Exception)] {...} | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:245:17:248:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:246:21:247:47 | [finally: exception(Exception)] if (...) ... | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:246:21:247:47 | [finally: exception(ExceptionA)] if (...) ... | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:246:25:246:26 | [finally: exception(Exception)] access to parameter b2 | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:246:25:246:26 | [finally: exception(ExceptionA)] access to parameter b2 | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:247:25:247:47 | [finally: exception(Exception)] throw ...; | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:247:25:247:47 | [finally: exception(ExceptionA)] throw ...; | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:247:31:247:46 | [finally: exception(Exception)] object creation of type ExceptionA | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:247:31:247:46 | [finally: exception(ExceptionA)] object creation of type ExceptionA | Finally.cs:237:13:253:13 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally(1): exception(Exception)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally(1): exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(Exception)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(Exception), finally(1): exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(Exception)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(Exception)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:250:17:252:17 | [finally: exception(ExceptionA)] {...} | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally(1): exception(Exception)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(Exception), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(Exception)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:54 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally(1): exception(Exception)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally(1): exception(ExceptionA)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(Exception)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(Exception), finally(1): exception(ExceptionA)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(Exception)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(Exception)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:21:251:55 | [finally: exception(ExceptionA)] ...; | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally(1): exception(Exception)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(Exception)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(Exception), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(Exception)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(Exception)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA), finally(1): exception(ExceptionA)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:251:39:251:53 | [finally: exception(ExceptionA)] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | -| Finally.cs:257:9:259:9 | [finally: exception(Exception)] {...} | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:257:9:259:9 | [finally: exception(ExceptionA)] {...} | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:13:258:46 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:13:258:46 | [finally: exception(ExceptionA)] call to method WriteLine | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:13:258:47 | [finally: exception(Exception)] ...; | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:13:258:47 | [finally: exception(ExceptionA)] ...; | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:31:258:45 | [finally: exception(Exception)] "Outer finally" | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:258:31:258:45 | [finally: exception(ExceptionA)] "Outer finally" | Finally.cs:235:9:259:9 | try {...} ... | -| Finally.cs:270:9:273:9 | [finally: exception(Exception)] {...} | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:271:13:271:34 | [finally: exception(Exception)] call to method WriteLine | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:271:13:271:35 | [finally: exception(Exception)] ...; | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:271:31:271:33 | [finally: exception(Exception)] "3" | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:13:272:13 | [finally: exception(Exception)] access to parameter i | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... + ... | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:13:272:18 | [finally: exception(Exception)] ... = ... | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:13:272:19 | [finally: exception(Exception)] ...; | Finally.cs:265:9:273:9 | try {...} ... | -| Finally.cs:272:18:272:18 | [finally: exception(Exception)] 3 | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:140:9:143:9 | [finally: exception] {...} | Finally.cs:135:9:143:9 | try {...} ... | +| Finally.cs:141:13:141:44 | [finally: exception] throw ...; | Finally.cs:135:9:143:9 | try {...} ... | +| Finally.cs:141:19:141:43 | [finally: exception] object creation of type ArgumentException | Finally.cs:135:9:143:9 | try {...} ... | +| Finally.cs:141:41:141:42 | [finally: exception] "" | Finally.cs:135:9:143:9 | try {...} ... | +| Finally.cs:155:9:169:9 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:156:13:168:13 | [finally: exception] try {...} ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:157:13:160:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:17:159:45 | [finally: exception] if (...) ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:21:158:24 | [finally: exception] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:21:158:31 | [finally: exception] access to property Length | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:21:158:36 | [finally: exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:158:36:158:36 | [finally: exception] 1 | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:159:21:159:45 | [finally: exception] throw ...; | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:159:27:159:44 | [finally: exception] object creation of type Exception | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:159:41:159:43 | [finally: exception] "1" | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:13:164:13 | [finally: exception, exception: Exception] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:13:164:13 | [finally: exception, exception: NullReferenceException] catch (...) {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:30:161:30 | [finally: exception, exception: Exception] Exception e | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:30:161:30 | [finally: exception, exception: NullReferenceException] Exception e | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:39 | [finally: exception, exception: Exception] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:39 | [finally: exception, exception: NullReferenceException] access to local variable e | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:47 | [finally: exception, exception: Exception] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:47 | [finally: exception, exception: NullReferenceException] access to property Message | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:54 | [finally: exception, exception: Exception] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:39:161:54 | [finally: exception, exception: NullReferenceException] ... == ... | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:52:161:54 | [finally: exception, exception: Exception] "1" | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:161:52:161:54 | [finally: exception, exception: NullReferenceException] "1" | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:162:13:164:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:17:163:42 | [finally: exception] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:17:163:43 | [finally: exception] ...; | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:35:163:38 | [finally: exception] access to parameter args | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:35:163:41 | [finally: exception] access to array element | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:163:40:163:40 | [finally: exception] 0 | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:165:13:168:13 | [finally: exception] catch {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:166:13:168:13 | [finally: exception] {...} | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:167:17:167:37 | [finally: exception] call to method WriteLine | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:167:17:167:38 | [finally: exception] ...; | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:167:35:167:36 | [finally: exception] "" | Finally.cs:149:9:169:9 | try {...} ... | +| Finally.cs:183:9:192:9 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:184:13:191:13 | [finally: exception, b1 (line 176): true] try {...} ... | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:185:13:187:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:186:17:186:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:186:21:186:22 | [finally: exception, b1 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:186:25:186:47 | [finally: exception, b1 (line 176): true, b2 (line 176): true] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:186:31:186:46 | [finally: exception, b1 (line 176): true, b2 (line 176): true] object creation of type ExceptionB | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:188:13:191:13 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:188:13:191:13 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] catch (...) {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:188:38:188:39 | [finally: exception, exception: Exception, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:188:38:188:39 | [finally: exception, exception: ExceptionB, b1 (line 176): true, b2 (line 176): true] access to parameter b2 | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:189:13:191:13 | [finally: exception, b1 (line 176): true] {...} | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:190:17:190:47 | [finally: exception, b1 (line 176): true] if (...) ... | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:190:21:190:22 | [finally: exception, b1 (line 176): true] access to parameter b1 | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:190:25:190:47 | [finally: exception] throw ...; | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:190:31:190:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:178:9:192:9 | try {...} ... | +| Finally.cs:202:9:212:9 | [finally: exception] {...} | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:203:13:210:13 | [finally: exception] try {...} ... | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:204:13:206:13 | [finally: exception] {...} | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:205:17:205:47 | [finally: exception] if (...) ... | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:205:21:205:22 | [finally: exception] access to parameter b2 | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:205:25:205:47 | [finally: exception] throw ...; | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:205:31:205:46 | [finally: exception] object creation of type ExceptionB | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:208:13:210:13 | [finally(1): exception] {...} | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:208:13:210:13 | [finally: exception, finally(1): exception] {...} | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:208:13:210:13 | [finally: exception] {...} | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:17:209:47 | [finally(1): exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:17:209:47 | [finally: exception, finally(1): exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:17:209:47 | [finally: exception] if (...) ... | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:21:209:22 | [finally(1): exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:21:209:22 | [finally: exception, finally(1): exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:21:209:22 | [finally: exception] access to parameter b3 | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:25:209:47 | [finally(1): exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:25:209:47 | [finally: exception, finally(1): exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:25:209:47 | [finally: exception] throw ...; | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:31:209:46 | [finally(1): exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:31:209:46 | [finally: exception, finally(1): exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:209:31:209:46 | [finally: exception] object creation of type ExceptionC | Finally.cs:203:13:210:13 | try {...} ... | +| Finally.cs:211:13:211:16 | [finally: exception] this access | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:211:13:211:28 | [finally: exception] ... = ... | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:211:13:211:29 | [finally: exception] ...; | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:211:26:211:28 | [finally: exception] "0" | Finally.cs:197:9:212:9 | try {...} ... | +| Finally.cs:243:13:253:13 | [finally: exception] {...} | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:244:17:252:17 | [finally: exception] try {...} ... | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:245:17:248:17 | [finally: exception] {...} | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:246:21:247:47 | [finally: exception] if (...) ... | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:246:25:246:26 | [finally: exception] access to parameter b2 | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:247:25:247:47 | [finally: exception] throw ...; | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:247:31:247:46 | [finally: exception] object creation of type ExceptionA | Finally.cs:237:13:253:13 | try {...} ... | +| Finally.cs:250:17:252:17 | [finally(1): exception] {...} | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:250:17:252:17 | [finally: exception, finally(1): exception] {...} | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:250:17:252:17 | [finally: exception] {...} | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:54 | [finally(1): exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:54 | [finally: exception, finally(1): exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:54 | [finally: exception] call to method WriteLine | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:55 | [finally(1): exception] ...; | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:55 | [finally: exception, finally(1): exception] ...; | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:21:251:55 | [finally: exception] ...; | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:39:251:53 | [finally(1): exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:39:251:53 | [finally: exception, finally(1): exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:251:39:251:53 | [finally: exception] "Inner finally" | Finally.cs:244:17:252:17 | try {...} ... | +| Finally.cs:257:9:259:9 | [finally: exception] {...} | Finally.cs:235:9:259:9 | try {...} ... | +| Finally.cs:258:13:258:46 | [finally: exception] call to method WriteLine | Finally.cs:235:9:259:9 | try {...} ... | +| Finally.cs:258:13:258:47 | [finally: exception] ...; | Finally.cs:235:9:259:9 | try {...} ... | +| Finally.cs:258:31:258:45 | [finally: exception] "Outer finally" | Finally.cs:235:9:259:9 | try {...} ... | +| Finally.cs:270:9:273:9 | [finally: exception] {...} | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:271:13:271:34 | [finally: exception] call to method WriteLine | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:271:13:271:35 | [finally: exception] ...; | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:271:31:271:33 | [finally: exception] "3" | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:13:272:13 | [finally: exception] access to parameter i | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:13:272:18 | [finally: exception] ... + ... | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:13:272:18 | [finally: exception] ... = ... | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:13:272:19 | [finally: exception] ...; | Finally.cs:265:9:273:9 | try {...} ... | +| Finally.cs:272:18:272:18 | [finally: exception] 3 | Finally.cs:265:9:273:9 | try {...} ... | | cflow.cs:274:9:276:9 | [finally: return] {...} | cflow.cs:268:9:276:9 | try {...} ... | | cflow.cs:275:13:275:41 | [finally: return] call to method WriteLine | cflow.cs:268:9:276:9 | try {...} ... | | cflow.cs:275:13:275:42 | [finally: return] ...; | cflow.cs:268:9:276:9 | try {...} ... | diff --git a/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql b/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql index fb937bfbd9f7..3f4ed835fc24 100644 --- a/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql +++ b/csharp/ql/test/library-tests/controlflow/graph/Nodes.ql @@ -12,7 +12,7 @@ class MyFinallySplitControlFlowNode extends ElementNode { exists(Splitting::FinallySplitting::FinallySplitType type | type = this.getASplit().(FinallySplit).getType() | - not type instanceof SuccessorTypes::NormalSuccessor + not type instanceof DirectSuccessor ) } diff --git a/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected b/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected index b8a976a78a6a..2c4b9de438ea 100644 --- a/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected +++ b/csharp/ql/test/library-tests/csharp8/switchexprcontrolflow.expected @@ -45,9 +45,9 @@ | patterns.cs:110:25:110:25 | 0 | patterns.cs:110:22:110:26 | (..., ...) | semmle.label | successor | | patterns.cs:111:13:111:17 | ( ... ) | patterns.cs:111:13:111:17 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:111:13:111:17 | ( ... ) | patterns.cs:111:14:111:14 | 1 | semmle.label | match | -| patterns.cs:111:13:111:17 | [match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:111:13:111:17 | [match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception | | patterns.cs:111:13:111:17 | [match] { ... } | patterns.cs:111:23:111:23 | 0 | semmle.label | match | -| patterns.cs:111:13:111:17 | [no-match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:111:13:111:17 | [no-match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception | | patterns.cs:111:13:111:26 | ... => ... | patterns.cs:108:24:112:9 | ... switch { ... } | semmle.label | successor | | patterns.cs:111:14:111:14 | 1 | patterns.cs:111:13:111:17 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:111:14:111:14 | 1 | patterns.cs:111:16:111:16 | 0 | semmle.label | match | @@ -89,9 +89,9 @@ | patterns.cs:118:32:118:33 | access to local variable x2 | patterns.cs:118:28:118:34 | (..., ...) | semmle.label | successor | | patterns.cs:119:13:119:28 | ( ... ) | patterns.cs:119:13:119:28 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:119:13:119:28 | ( ... ) | patterns.cs:119:14:119:19 | Int32 x2 | semmle.label | match | -| patterns.cs:119:13:119:28 | [match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:119:13:119:28 | [match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception | | patterns.cs:119:13:119:28 | [match] { ... } | patterns.cs:119:34:119:34 | 0 | semmle.label | match | -| patterns.cs:119:13:119:28 | [no-match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:119:13:119:28 | [no-match] { ... } | patterns.cs:98:10:98:20 | exit Expressions (abnormal) | semmle.label | exception | | patterns.cs:119:13:119:38 | ... => ... | patterns.cs:115:20:120:9 | ... switch { ... } | semmle.label | successor | | patterns.cs:119:14:119:19 | Int32 x2 | patterns.cs:119:13:119:28 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:119:14:119:19 | Int32 x2 | patterns.cs:119:22:119:27 | Int32 y2 | semmle.label | match | @@ -148,7 +148,7 @@ | patterns.cs:130:17:130:17 | 2 | patterns.cs:130:13:130:18 | [match] { ... } | semmle.label | match | | patterns.cs:130:17:130:17 | 2 | patterns.cs:130:13:130:18 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:130:23:130:23 | 2 | patterns.cs:130:13:130:23 | ... => ... | semmle.label | successor | -| patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception(InvalidOperationException) | +| patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception | | patterns.cs:131:13:131:22 | (..., ...) | patterns.cs:131:27:131:27 | 3 | semmle.label | match | | patterns.cs:131:13:131:27 | ... => ... | patterns.cs:126:17:132:9 | ... switch { ... } | semmle.label | successor | | patterns.cs:131:18:131:18 | Int32 x | patterns.cs:131:21:131:21 | _ | semmle.label | successor | @@ -162,9 +162,9 @@ | patterns.cs:136:17:143:13 | ... switch { ... } | patterns.cs:136:13:143:13 | ... = ... | semmle.label | successor | | patterns.cs:138:17:138:17 | 1 | patterns.cs:138:28:138:50 | object creation of type ArgumentException | semmle.label | match | | patterns.cs:138:17:138:17 | 1 | patterns.cs:139:17:139:17 | 2 | semmle.label | no-match | -| patterns.cs:138:22:138:50 | throw ... | patterns.cs:145:9:148:9 | [exception: ArgumentException] catch (...) {...} | semmle.label | exception(ArgumentException) | +| patterns.cs:138:22:138:50 | throw ... | patterns.cs:145:9:148:9 | [exception: ArgumentException] catch (...) {...} | semmle.label | exception | | patterns.cs:138:28:138:50 | object creation of type ArgumentException | patterns.cs:138:22:138:50 | throw ... | semmle.label | successor | -| patterns.cs:138:28:138:50 | object creation of type ArgumentException | patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | semmle.label | exception(Exception) | +| patterns.cs:138:28:138:50 | object creation of type ArgumentException | patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | semmle.label | exception | | patterns.cs:139:17:139:17 | 2 | patterns.cs:139:22:139:22 | 3 | semmle.label | match | | patterns.cs:139:17:139:17 | 2 | patterns.cs:140:17:140:24 | Object y | semmle.label | no-match | | patterns.cs:139:17:139:22 | ... => ... | patterns.cs:136:17:143:13 | ... switch { ... } | semmle.label | successor | @@ -187,16 +187,16 @@ | patterns.cs:142:17:142:24 | access to type MyStruct | patterns.cs:142:17:142:36 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:142:17:142:24 | access to type MyStruct | patterns.cs:142:31:142:32 | 10 | semmle.label | match | | patterns.cs:142:17:142:36 | [match] { ... } | patterns.cs:142:41:142:41 | 6 | semmle.label | match | -| patterns.cs:142:17:142:36 | [match] { ... } | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | semmle.label | exception(InvalidOperationException) | -| patterns.cs:142:17:142:36 | [no-match] { ... } | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | semmle.label | exception(InvalidOperationException) | +| patterns.cs:142:17:142:36 | [match] { ... } | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | semmle.label | exception | +| patterns.cs:142:17:142:36 | [no-match] { ... } | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | semmle.label | exception | | patterns.cs:142:17:142:41 | ... => ... | patterns.cs:136:17:143:13 | ... switch { ... } | semmle.label | successor | | patterns.cs:142:26:142:34 | [match] { ... } | patterns.cs:142:17:142:36 | [match] { ... } | semmle.label | match | | patterns.cs:142:26:142:34 | [no-match] { ... } | patterns.cs:142:17:142:36 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:142:31:142:32 | 10 | patterns.cs:142:26:142:34 | [match] { ... } | semmle.label | match | | patterns.cs:142:31:142:32 | 10 | patterns.cs:142:26:142:34 | [no-match] { ... } | semmle.label | no-match | | patterns.cs:142:41:142:41 | 6 | patterns.cs:142:17:142:41 | ... => ... | semmle.label | successor | -| patterns.cs:145:9:148:9 | [exception: ArgumentException] catch (...) {...} | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception(ArgumentException) | -| patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception(Exception) | +| patterns.cs:145:9:148:9 | [exception: ArgumentException] catch (...) {...} | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception | +| patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | patterns.cs:123:10:123:21 | exit Expressions2 (abnormal) | semmle.label | exception | | patterns.cs:145:9:148:9 | [exception: Exception] catch (...) {...} | patterns.cs:145:41:145:42 | [exception: Exception] InvalidOperationException ex | semmle.label | match | | patterns.cs:145:9:148:9 | [exception: InvalidOperationException] catch (...) {...} | patterns.cs:145:41:145:42 | [exception: InvalidOperationException] InvalidOperationException ex | semmle.label | match | | patterns.cs:145:41:145:42 | [exception: Exception] InvalidOperationException ex | patterns.cs:146:9:148:9 | {...} | semmle.label | successor | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected index 8d0e2b8261db..7fa4581f5aae 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDef.expected @@ -35,7 +35,7 @@ | 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) | -| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception(Exception)] SSA def(i) | +| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | | 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) | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected index 272db29e6f4f..02e4624488ea 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaDefElement.expected @@ -35,7 +35,7 @@ | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... | | 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:15:17:15:21 | [finally: 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 | ... = ... | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected index 3dfc82d27ad0..4a2158c6736a 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaExplicitDef.expected @@ -15,7 +15,7 @@ | 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:248:36:248:36 | j | Capture.cs:251:13:251:17 | SSA def(j) | Capture.cs:251:13:251:17 | ... = ... | | 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:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: 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:44:11:44:11 | s | Consistency.cs:44:11:44:11 | SSA def(s) | Consistency.cs:44:11:44:11 | S s | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected index 9daa4269711c..cc6a0e595465 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaRead.expected @@ -35,7 +35,7 @@ | 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 | | 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:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: 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:26:13:26:13 | access to local variable c | | 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:26:13:26:19 | access to field Field | diff --git a/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected b/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected index d0e6b073f01a..1219abdfe452 100644 --- a/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected +++ b/csharp/ql/test/library-tests/dataflow/ssa/SsaUltimateDef.expected @@ -35,7 +35,7 @@ | 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) | -| 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 | [finally: exception(Exception)] SSA def(i) | +| Consistency.cs:15:17:15:17 | i | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | Consistency.cs:15:17:15:21 | [finally: exception] SSA def(i) | | 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) | diff --git a/csharp/ql/test/library-tests/goto/Goto1.expected b/csharp/ql/test/library-tests/goto/Goto1.expected index e6c124726a3d..0baaf5ef723a 100644 --- a/csharp/ql/test/library-tests/goto/Goto1.expected +++ b/csharp/ql/test/library-tests/goto/Goto1.expected @@ -7,7 +7,7 @@ | goto.cs:5:5:20:5 | {...} | goto.cs:6:9:8:9 | {...} | semmle.label | successor | | goto.cs:6:9:8:9 | {...} | goto.cs:7:13:7:14 | s1: | semmle.label | successor | | goto.cs:7:13:7:14 | s1: | goto.cs:7:17:7:24 | goto ...; | semmle.label | successor | -| goto.cs:7:17:7:24 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto(s2) | +| goto.cs:7:17:7:24 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto | | goto.cs:9:9:9:10 | s2: | goto.cs:9:13:9:27 | ... ...; | semmle.label | successor | | goto.cs:9:13:9:27 | ... ...; | goto.cs:9:24:9:26 | "5" | semmle.label | successor | | goto.cs:9:20:9:26 | String s = ... | goto.cs:10:9:18:9 | switch (...) {...} | semmle.label | successor | @@ -18,24 +18,24 @@ | goto.cs:12:18:12:21 | null | goto.cs:12:24:12:25 | s3: | semmle.label | match | | goto.cs:12:18:12:21 | null | goto.cs:13:13:13:21 | case ...: | semmle.label | no-match | | goto.cs:12:24:12:25 | s3: | goto.cs:12:38:12:40 | "1" | semmle.label | successor | -| goto.cs:12:28:12:41 | goto case ...; | goto.cs:13:13:13:21 | case ...: | semmle.label | goto(1) | +| goto.cs:12:28:12:41 | goto case ...; | goto.cs:13:13:13:21 | case ...: | semmle.label | goto | | goto.cs:12:38:12:40 | "1" | goto.cs:12:28:12:41 | goto case ...; | semmle.label | successor | | goto.cs:13:13:13:21 | case ...: | goto.cs:13:18:13:20 | "1" | semmle.label | successor | | goto.cs:13:18:13:20 | "1" | goto.cs:13:23:13:24 | s4: | semmle.label | match | | goto.cs:13:18:13:20 | "1" | goto.cs:14:13:14:21 | case ...: | semmle.label | no-match | | goto.cs:13:23:13:24 | s4: | goto.cs:13:37:13:39 | "2" | semmle.label | successor | -| goto.cs:13:27:13:40 | goto case ...; | goto.cs:14:13:14:21 | case ...: | semmle.label | goto(2) | +| goto.cs:13:27:13:40 | goto case ...; | goto.cs:14:13:14:21 | case ...: | semmle.label | goto | | goto.cs:13:37:13:39 | "2" | goto.cs:13:27:13:40 | goto case ...; | semmle.label | successor | | goto.cs:14:13:14:21 | case ...: | goto.cs:14:18:14:20 | "2" | semmle.label | successor | | goto.cs:14:18:14:20 | "2" | goto.cs:14:23:14:24 | s5: | semmle.label | match | | goto.cs:14:18:14:20 | "2" | goto.cs:15:13:15:21 | case ...: | semmle.label | no-match | | goto.cs:14:23:14:24 | s5: | goto.cs:14:27:14:34 | goto ...; | semmle.label | successor | -| goto.cs:14:27:14:34 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto(s2) | +| goto.cs:14:27:14:34 | goto ...; | goto.cs:9:9:9:10 | s2: | semmle.label | goto | | goto.cs:15:13:15:21 | case ...: | goto.cs:15:18:15:20 | "3" | semmle.label | successor | | goto.cs:15:18:15:20 | "3" | goto.cs:15:23:15:24 | s6: | semmle.label | match | | goto.cs:15:18:15:20 | "3" | goto.cs:16:13:16:21 | case ...: | semmle.label | no-match | | goto.cs:15:23:15:24 | s6: | goto.cs:15:27:15:39 | goto default; | semmle.label | successor | -| goto.cs:15:27:15:39 | goto default; | goto.cs:17:13:17:20 | default: | semmle.label | goto(default) | +| goto.cs:15:27:15:39 | goto default; | goto.cs:17:13:17:20 | default: | semmle.label | goto | | goto.cs:16:13:16:21 | case ...: | goto.cs:16:18:16:20 | "4" | semmle.label | successor | | goto.cs:16:18:16:20 | "4" | goto.cs:16:23:16:24 | s7: | semmle.label | match | | goto.cs:16:18:16:20 | "4" | goto.cs:17:13:17:20 | default: | semmle.label | no-match | @@ -43,7 +43,7 @@ | goto.cs:16:27:16:32 | break; | goto.cs:19:9:19:10 | s9: | semmle.label | break | | goto.cs:17:13:17:20 | default: | goto.cs:17:22:17:23 | s8: | semmle.label | successor | | goto.cs:17:22:17:23 | s8: | goto.cs:17:36:17:39 | null | semmle.label | successor | -| goto.cs:17:26:17:40 | goto case ...; | goto.cs:12:13:12:22 | case ...: | semmle.label | goto(null) | +| goto.cs:17:26:17:40 | goto case ...; | goto.cs:12:13:12:22 | case ...: | semmle.label | goto | | goto.cs:17:36:17:39 | null | goto.cs:17:26:17:40 | goto case ...; | semmle.label | successor | | goto.cs:19:9:19:10 | s9: | goto.cs:19:12:19:12 | ; | semmle.label | successor | | goto.cs:19:12:19:12 | ; | goto.cs:4:17:4:20 | exit Main (normal) | semmle.label | successor | diff --git a/csharp/scripts/create-extractor-pack.sh b/csharp/scripts/create-extractor-pack.sh index c3e6090a6351..a1b5a044ebc8 100755 --- a/csharp/scripts/create-extractor-pack.sh +++ b/csharp/scripts/create-extractor-pack.sh @@ -21,7 +21,7 @@ mkdir -p extractor-pack mkdir -p extractor-pack/tools/${platform} function dotnet_publish { - dotnet publish --self-contained --configuration Release --runtime ${dotnet_platform} -p:RuntimeFrameworkVersion=9.0.0 $1 --output extractor-pack/tools/${platform} + dotnet publish --self-contained --configuration Release --runtime ${dotnet_platform} -p:RuntimeFrameworkVersion=9.0.5 $1 --output extractor-pack/tools/${platform} } dotnet tool restore diff --git a/csharp/scripts/stubs/helpers.py b/csharp/scripts/stubs/helpers.py index d1f3bdb59c2f..f3810e4f8cc8 100644 --- a/csharp/scripts/stubs/helpers.py +++ b/csharp/scripts/stubs/helpers.py @@ -118,7 +118,7 @@ def make_stubs(self): bqrsFile = os.path.join(rawOutputDir, outputName + '.bqrs') jsonFile = os.path.join(rawOutputDir, outputName + '.json') - sdk_version = '9.0.100' + sdk_version = '9.0.300' print("\n* Creating new global.json file and setting SDK to " + sdk_version) self.run_cmd(['dotnet', 'new', 'globaljson', '--force', '--sdk-version', sdk_version, '--output', self.workDir]) diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.0.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.0.rst new file mode 100644 index 000000000000..d87754d8391a --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.23.0.rst @@ -0,0 +1,149 @@ +.. _codeql-cli-2.23.0: + +========================== +CodeQL 2.23.0 (2025-09-04) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.23.0 runs a total of 479 security queries when configured with the Default suite (covering 169 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). 2 security queries have been added with this release. + +CodeQL CLI +---------- + +Miscellaneous +~~~~~~~~~~~~~ + +* The build of Eclipse Temurin OpenJDK that is used to run the CodeQL CLI has been updated to version 21.0.8. + +Query Packs +----------- + +Bug Fixes +~~~~~~~~~ + +C/C++ +""""" + +* Fixed an inconsistency across languages where most have a :code:`Customizations.qll` file for adding customizations, but not all did. + +Swift +""""" + +* Fixed an inconsistency across languages where most have a :code:`Customizations.qll` file for adding customizations, but not all did. + +Rust +"""" + +* The "Low Rust analysis quality" query (:code:`rust/diagnostic/database-quality`) has been tuned so that it won't trigger on databases that have extracted normally. This will remove spurious messages of "Low Rust analysis quality" on the CodeQL status page. +* Fixed an inconsistency across languages where most have a :code:`Customizations.qll` file for adding customizations, but not all did. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Java/Kotlin +""""""""""" + +* Fixed a bug that was causing false negatives in rare cases in the query :code:`java/dereferenced-value-may-be-null`. +* Removed the :code:`java/empty-statement` query that was subsumed by the :code:`java/empty-block` query. + +Python +"""""" + +* The :code:`py/unexpected-raise-in-special-method` query has been modernized. It produces additional results in cases where the exception is + only raised conditionally. Its precision has been changed from :code:`very-high` to :code:`high`. +* The queries :code:`py/incomplete-ordering`, :code:`py/inconsistent-equality`, and :code:`py/equals-hash-mismatch` have been modernized; no longer relying on outdated libraries, improved documentation, and no longer producing alerts for problems specific to Python 2. + +New Queries +~~~~~~~~~~~ + +Java/Kotlin +""""""""""" + +* The query :code:`java/insecure-spring-actuator-config` has been promoted from experimental to the main query pack as :code:`java/spring-boot-exposed-actuators-config`. Its results will now appear by default. This query detects exposure of Spring Boot actuators through configuration files. It was originally submitted as an experimental query `by @luchua-bc `__. + +Rust +"""" + +* Added a new query, :code:`rust/log-injection`, for detecting cases where log entries could be forged by a malicious user. + +Query Metadata Changes +~~~~~~~~~~~~~~~~~~~~~~ + +Java/Kotlin +""""""""""" + +* The tag :code:`maintainability` has been removed from :code:`java/run-finalizers-on-exit` and the tags :code:`quality`, :code:`correctness`, and :code:`performance` have been added. +* The tag :code:`maintainability` has been removed from :code:`java/garbage-collection` and the tags :code:`quality` and :code:`correctness` have been added. + +Language Libraries +------------------ + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Rust +"""" + +* Path resolution has been removed from the Rust extractor. For the majority of purposes CodeQL computed paths have been in use for several previous releases, this completes the transition. Extraction is now faster and more reliable. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C/C++ +""""" + +* Added flow summaries for the :code:`Microsoft::WRL::ComPtr` member functions. +* The new dataflow/taint-tracking library (:code:`semmle.code.cpp.dataflow.new.DataFlow` and :code:`semmle.code.cpp.dataflow.new.TaintTracking`) now resolves virtual function calls more precisely. This results in fewer false positives when running dataflow/taint-tracking queries on C++ projects. + +C# +"" + +* A bug has been fixed in the data flow analysis, which means that flow through calls using the :code:`base` qualifier may now be tracked more accurately. +* Added summary models for :code:`System.Xml.XmlReader`, :code:`System.Xml.XmlTextReader` and :code:`System.Xml.XmlDictionaryReader`. +* Models-as-data summaries for byte and char arrays and pointers now treat the entire collection as tainted, reflecting their common use as string alternatives. +* The default taint tracking configuration now allows implicit reads from collections at sinks and in additional flow steps. This increases flow coverage for many taint tracking queries and helps reduce false negatives. + +JavaScript/TypeScript +""""""""""""""""""""" + +* Removed :code:`libxmljs` as an XML bomb sink. The underlying libxml2 library now includes `entity reference loop detection `__ that prevents XML bomb attacks. + +Python +"""""" + +* The modelling of Psycopg2 now supports the use of :code:`psycopg2.pool` connection pools for handling database connections. +* Removed :code:`lxml` as an XML bomb sink. The underlying libxml2 library now includes `entity reference loop detection `__ that prevents XML bomb attacks. + +Rust +"""" + +* Attribute macros are now taken into account when identifying macro-expanded code. This affects the queries :code:`rust/unused-variable` and :code:`rust/unused-value`, which exclude results in macro-expanded code. +* Improved modelling of the :code:`std::fs`, :code:`async_std::fs` and :code:`tokio::fs` libraries. This may cause more alerts to be found by Rust injection queries, particularly :code:`rust/path-injection`. + +New Features +~~~~~~~~~~~~ + +C/C++ +""""" + +* Added a new class :code:`PchFile` representing precompiled header (PCH) files used during project compilation. + +Shared Libraries +---------------- + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Utility Classes +""""""""""""""" + +* Added :code:`LocatableOption` and :code:`OptionWithLocationInfo` as modules providing option types with location information. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index c47ae0a688e4..87cd03ebfaf1 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here -

The corrected version of user checks err before using ptr.

+

The corrected version of user checks err before using ptr.

diff --git a/go/ql/src/InconsistentCode/MissingErrorCheck.ql b/go/ql/src/InconsistentCode/MissingErrorCheck.ql index 8e277c6ae747..6a68904427de 100644 --- a/go/ql/src/InconsistentCode/MissingErrorCheck.ql +++ b/go/ql/src/InconsistentCode/MissingErrorCheck.ql @@ -22,7 +22,7 @@ predicate isNil(DataFlow::Node node) { node = Builtin::nil().getARead() } /** * Matches if `call` may return a nil pointer alongside an error value. * - * This is both an over- and under-estimate: over in that we assume opaque functions may use this + * This is both an over- and under-estimate: over in that we assume opaque functions may use this * convention, and under in that functions with bodies are only recognized if they use a literal * `nil` for the pointer return value at some return site. */ diff --git a/go/ql/src/Security/CWE-327/InsecureTLS.ql b/go/ql/src/Security/CWE-327/InsecureTLS.ql index a4a9ab1f549a..dba6f2d54ca9 100644 --- a/go/ql/src/Security/CWE-327/InsecureTLS.ql +++ b/go/ql/src/Security/CWE-327/InsecureTLS.ql @@ -211,7 +211,7 @@ module TlsInsecureCipherSuitesFlow = TaintTracking::Global`_,``com.google.common.*``,,730,43,9,,,,, JBoss Logging,``org.jboss.logging``,,,324,,,,,, `JSON-java `_,``org.json``,,236,,,,,,, - Java Standard Library,``java.*``,10,4621,260,99,,9,,,26 - Java extensions,"``javax.*``, ``jakarta.*``",87,4159,90,10,4,2,1,1,4 + Java Standard Library,``java.*``,10,4628,260,99,,9,,,26 + Java extensions,"``javax.*``, ``jakarta.*``",87,4185,90,10,4,2,1,1,4 Kotlin Standard Library,``kotlin*``,,1849,16,14,,,,,2 `Spring `_,``org.springframework.*``,38,486,143,26,,28,14,,35 Others,"``actions.osgi``, ``antlr``, ``ch.ethz.ssh2``, ``cn.hutool.core.codec``, ``com.alibaba.com.caucho.hessian.io``, ``com.alibaba.druid.sql``, ``com.alibaba.fastjson2``, ``com.amazonaws.auth``, ``com.auth0.jwt.algorithms``, ``com.azure.identity``, ``com.caucho.burlap.io``, ``com.caucho.hessian.io``, ``com.cedarsoftware.util.io``, ``com.esotericsoftware.kryo.io``, ``com.esotericsoftware.kryo5.io``, ``com.esotericsoftware.yamlbeans``, ``com.fasterxml.jackson.core``, ``com.fasterxml.jackson.databind``, ``com.google.gson``, ``com.hubspot.jinjava``, ``com.jcraft.jsch``, ``com.microsoft.sqlserver.jdbc``, ``com.mitchellbosecke.pebble``, ``com.mongodb``, ``com.opensymphony.xwork2``, ``com.rabbitmq.client``, ``com.sshtools.j2ssh.authentication``, ``com.sun.crypto.provider``, ``com.sun.jndi.ldap``, ``com.sun.net.httpserver``, ``com.sun.net.ssl``, ``com.sun.rowset``, ``com.sun.security.auth.module``, ``com.sun.security.ntlm``, ``com.sun.security.sasl.digest``, ``com.thoughtworks.xstream``, ``com.trilead.ssh2``, ``com.unboundid.ldap.sdk``, ``com.zaxxer.hikari``, ``flexjson``, ``freemarker.cache``, ``freemarker.template``, ``groovy.lang``, ``groovy.text``, ``groovy.util``, ``hudson``, ``io.jsonwebtoken``, ``io.netty.bootstrap``, ``io.netty.buffer``, ``io.netty.channel``, ``io.netty.handler.codec``, ``io.netty.handler.ssl``, ``io.netty.handler.stream``, ``io.netty.resolver``, ``io.netty.util``, ``io.undertow.server.handlers.resource``, ``javafx.scene.web``, ``jenkins``, ``jodd.json``, ``liquibase.database.jvm``, ``liquibase.statement.core``, ``net.lingala.zip4j``, ``net.schmizz.sshj``, ``net.sf.json``, ``net.sf.saxon.s9api``, ``ognl``, ``okhttp3``, ``org.acegisecurity``, ``org.antlr.runtime``, ``org.apache.commons.codec``, ``org.apache.commons.compress.archivers.tar``, ``org.apache.commons.exec``, ``org.apache.commons.httpclient.util``, ``org.apache.commons.jelly``, ``org.apache.commons.jexl2``, ``org.apache.commons.jexl3``, ``org.apache.commons.lang``, ``org.apache.commons.logging``, ``org.apache.commons.net``, ``org.apache.commons.ognl``, ``org.apache.cxf.catalog``, ``org.apache.cxf.common.classloader``, ``org.apache.cxf.common.jaxb``, ``org.apache.cxf.common.logging``, ``org.apache.cxf.configuration.jsse``, ``org.apache.cxf.helpers``, ``org.apache.cxf.resource``, ``org.apache.cxf.staxutils``, ``org.apache.cxf.tools.corba.utils``, ``org.apache.cxf.tools.util``, ``org.apache.cxf.transform``, ``org.apache.directory.ldap.client.api``, ``org.apache.hadoop.fs``, ``org.apache.hadoop.hive.metastore``, ``org.apache.hadoop.hive.ql.exec``, ``org.apache.hadoop.hive.ql.metadata``, ``org.apache.hc.client5.http.async.methods``, ``org.apache.hc.client5.http.classic.methods``, ``org.apache.hc.client5.http.fluent``, ``org.apache.hive.hcatalog.templeton``, ``org.apache.ibatis.jdbc``, ``org.apache.ibatis.mapping``, ``org.apache.log4j``, ``org.apache.shiro.authc``, ``org.apache.shiro.codec``, ``org.apache.shiro.jndi``, ``org.apache.shiro.mgt``, ``org.apache.sshd.client.session``, ``org.apache.struts.beanvalidation.validation.interceptor``, ``org.apache.struts2``, ``org.apache.tools.ant``, ``org.apache.tools.zip``, ``org.apache.velocity.app``, ``org.apache.velocity.runtime``, ``org.codehaus.cargo.container.installer``, ``org.codehaus.groovy.control``, ``org.dom4j``, ``org.eclipse.jetty.client``, ``org.exolab.castor.xml``, ``org.fusesource.leveldbjni``, ``org.geogebra.web.full.main``, ``org.gradle.api.file``, ``org.hibernate``, ``org.ho.yaml``, ``org.influxdb``, ``org.jabsorb``, ``org.jboss.vfs``, ``org.jdbi.v3.core``, ``org.jenkins.ui.icon``, ``org.jenkins.ui.symbol``, ``org.jooq``, ``org.keycloak.models.map.storage``, ``org.kohsuke.stapler``, ``org.lastaflute.web``, ``org.mvel2``, ``org.openjdk.jmh.runner.options``, ``org.owasp.esapi``, ``org.pac4j.jwt.config.encryption``, ``org.pac4j.jwt.config.signature``, ``org.scijava.log``, ``org.slf4j``, ``org.thymeleaf``, ``org.xml.sax``, ``org.xmlpull.v1``, ``org.yaml.snakeyaml``, ``play.libs.ws``, ``play.mvc``, ``ratpack.core.form``, ``ratpack.core.handling``, ``ratpack.core.http``, ``ratpack.exec``, ``ratpack.form``, ``ratpack.func``, ``ratpack.handling``, ``ratpack.http``, ``ratpack.util``, ``retrofit2``, ``software.amazon.awssdk.transfer.s3.model``, ``sun.jvmstat.perfdata.monitor.protocol.local``, ``sun.jvmstat.perfdata.monitor.protocol.rmi``, ``sun.misc``, ``sun.net.ftp``, ``sun.net.www.protocol.http``, ``sun.security.acl``, ``sun.security.jgss.krb5``, ``sun.security.krb5``, ``sun.security.pkcs``, ``sun.security.pkcs11``, ``sun.security.provider``, ``sun.security.ssl``, ``sun.security.x509``, ``sun.tools.jconsole``",133,10525,927,140,6,22,18,,208 - Totals,,330,26328,2656,404,16,128,33,1,409 + Totals,,330,26361,2656,404,16,128,33,1,409 diff --git a/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/old.dbscheme b/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/old.dbscheme new file mode 100644 index 000000000000..9f6026c40099 --- /dev/null +++ b/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/old.dbscheme @@ -0,0 +1,1240 @@ +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * javac A.java B.java C.java + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * javac A.java B.java C.java + */ + unique int id : @compilation, + int kind: int ref, + string cwd : string ref, + string name : string ref +); + +case @compilation.kind of + 1 = @javacompilation +| 2 = @kotlincompilation +; + +compilation_started( + int id : @compilation 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 + * + * javac A.java B.java C.java + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--javac-args` + * 2 | A.java + * 3 | B.java + * 4 | C.java + */ +#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` 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 + * + * javac A.java B.java C.java + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | A.java + * 1 | B.java + * 2 | C.java + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * For each file recorded in `compilation_compiling_files`, + * there will be a corresponding row in + * `compilation_compiling_files_completed` once extraction + * of that file is complete. The `result` will indicate the + * extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +#keyset[id, num] +compilation_compiling_files_completed( + int id : @compilation ref, + int num : int ref, + int result : int 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 +); + +/** + * The `cpu_seconds` and `elapsed_seconds` are the CPU time and elapsed + * time (respectively) that the original compilation (not the extraction) + * took for compiler invocation `id`. + */ +compilation_compiler_times( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float 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`. + * The `result` will indicate the extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref, + int result : int ref +); + +diagnostics( + unique int id: @diagnostic, + string generated_by: string ref, // TODO: Sync this with the other languages? + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/** + * 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 +); + +/* + * External artifacts + */ + +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +sourceLocationPrefix( + string prefix : string ref +); + +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path: string ref +); + +/* + * SMAP + */ + +smap_header( + int outputFileId: @file ref, + string outputFilename: string ref, + string defaultStratum: string ref +); + +smap_files( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + string inputFileName: string ref, + int inputFileId: @file ref +); + +smap_lines( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + int inputStartLine: int ref, + int inputLineCount: int ref, + int outputStartLine: int ref, + int outputLineIncrement: int ref +); + +/* + * Locations and files + */ + +@location = @location_default ; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +hasLocation( + int locatableid: @locatable ref, + int id: @location ref +); + +@sourceline = @locatable ; + +#keyset[element_id] +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int 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 +); + +/* + * Java + */ + +cupackage( + unique int id: @file ref, + int packageid: @package ref +); + +#keyset[fileid,keyName] +jarManifestMain( + int fileid: @file ref, + string keyName: string ref, + string value: string ref +); + +#keyset[fileid,entryName,keyName] +jarManifestEntries( + int fileid: @file ref, + string entryName: string ref, + string keyName: string ref, + string value: string ref +); + +packages( + unique int id: @package, + string nodeName: string ref +); + +primitives( + unique int id: @primitive, + string nodeName: string ref +); + +modifiers( + unique int id: @modifier, + string nodeName: string ref +); + +/** + * An errortype is used when the extractor is unable to extract a type + * correctly for some reason. + */ +error_type( + unique int id: @errortype +); + +classes_or_interfaces( + unique int id: @classorinterface, + string nodeName: string ref, + int parentid: @package ref, + int sourceid: @classorinterface ref +); + +file_class( + int id: @classorinterface ref +); + +class_object( + unique int id: @classorinterface ref, + unique int instance: @field ref +); + +type_companion_object( + unique int id: @classorinterface ref, + unique int instance: @field ref, + unique int companion_object: @classorinterface ref +); + +kt_nullable_types( + unique int id: @kt_nullable_type, + int classid: @reftype ref +) + +kt_notnull_types( + unique int id: @kt_notnull_type, + int classid: @reftype ref +) + +kt_type_alias( + unique int id: @kt_type_alias, + string name: string ref, + int kttypeid: @kt_type ref +) + +@kt_type = @kt_nullable_type | @kt_notnull_type + +isInterface( + unique int id: @classorinterface ref +); + +isRecord( + unique int id: @classorinterface ref +); + +fielddecls( + unique int id: @fielddecl, + int parentid: @reftype ref +); + +#keyset[fieldId] #keyset[fieldDeclId,pos] +fieldDeclaredIn( + int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref +); + +fields( + unique int id: @field, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref +); + +fieldsKotlinType( + unique int id: @field ref, + int kttypeid: @kt_type ref +); + +constrs( + unique int id: @constructor, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref +); + +constrsKotlinType( + unique int id: @constructor ref, + int kttypeid: @kt_type ref +); + +methods( + unique int id: @method, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref +); + +methodsKotlinType( + unique int id: @method ref, + int kttypeid: @kt_type ref +); + +#keyset[parentid,pos] +params( + unique int id: @param, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref +); + +paramsKotlinType( + unique int id: @param ref, + int kttypeid: @kt_type ref +); + +paramName( + unique int id: @param ref, + string nodeName: string ref +); + +isVarargsParam( + int param: @param ref +); + +exceptions( + unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref +); + +isAnnotType( + int interfaceid: @classorinterface ref +); + +isAnnotElem( + int methodid: @method ref +); + +annotValue( + int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref +); + +isEnumType( + int classid: @classorinterface ref +); + +isEnumConst( + int fieldid: @field ref +); + +#keyset[parentid,pos] +typeVars( + unique int id: @typevariable, + string nodeName: string ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +wildcards( + unique int id: @wildcard, + string nodeName: string ref, + int kind: int ref +); + +#keyset[parentid,pos] +typeBounds( + unique int id: @typebound, + int typeid: @reftype ref, + int pos: int ref, + int parentid: @boundedtype ref +); + +#keyset[parentid,pos] +typeArgs( + int argumentid: @reftype ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +isParameterized( + int memberid: @member ref +); + +isRaw( + int memberid: @member ref +); + +#keyset[classid] #keyset[parent] +isAnonymClass( + int classid: @classorinterface ref, + int parent: @classinstancexpr ref +); + +#keyset[typeid] #keyset[parent] +isLocalClassOrInterface( + int typeid: @classorinterface ref, + int parent: @localtypedeclstmt ref +); + +isImplicitClass( + unique int classid: @classorinterface ref +); + +isDefConstr( + int constructorid: @constructor ref +); + +#keyset[exprId] +lambdaKind( + int exprId: @lambdaexpr ref, + int bodyKind: int ref +); + +isCanonicalConstr( + int constructorid: @constructor ref +); + +arrays( + unique int id: @array, + string nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref +); + +enclInReftype( + unique int child: @reftype ref, + int parent: @reftype ref +); + +extendsReftype( + int id1: @reftype ref, + int id2: @classorinterface ref +); + +implInterface( + int id1: @classorarray ref, + int id2: @classorinterface ref +); + +permits( + int id1: @classorinterface ref, + int id2: @classorinterface ref +); + +hasModifier( + int id1: @modifiable ref, + int id2: @modifier ref +); + +imports( + unique int id: @import, + int holder: @classorinterfaceorpackage ref, + string name: string ref, + int kind: int ref +); + +#keyset[parent,idx] +stmts( + unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref +); + +@stmtparent = @callable | @stmt | @switchexpr | @whenexpr| @stmtexpr; + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localtypedeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause +| 23 = @yieldstmt +| 24 = @errorstmt +| 25 = @whenbranch +; + +#keyset[parent,idx] +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @exprparent ref, + int idx: int ref +); + +exprsKotlinType( + unique int id: @expr ref, + int kttypeid: @kt_type ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +isParenthesized( + unique int id: @expr ref, + int parentheses: int ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @newexpr +| 53 = @conditionalexpr +| 54 = @parexpr // deprecated +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @unannotatedtypeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @declannotation +| 67 = @uniontypeaccess +| 68 = @lambdaexpr +| 69 = @memberref +| 70 = @annotatedtypeaccess +| 71 = @typeannotation +| 72 = @intersectiontypeaccess +| 73 = @switchexpr +| 74 = @errorexpr +| 75 = @whenexpr +| 76 = @getclassexpr +| 77 = @safecastexpr +| 78 = @implicitcastexpr +| 79 = @implicitnotnullexpr +| 80 = @implicitcoerciontounitexpr +| 81 = @notinstanceofexpr +| 82 = @stmtexpr +| 83 = @stringtemplateexpr +| 84 = @notnullexpr +| 85 = @unsafecoerceexpr +| 86 = @valueeqexpr +| 87 = @valueneexpr +| 88 = @propertyref +| 89 = @recordpatternexpr +; + +/** Holds if this `when` expression was written as an `if` expression. */ +when_if(unique int id: @whenexpr ref); + +/** Holds if this `when` branch was written as an `else` branch. */ +when_branch_else(unique int id: @whenbranch ref); + +@classinstancexpr = @newexpr | @lambdaexpr | @memberref | @propertyref + +@annotation = @declannotation | @typeannotation +@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr + | @valueeqexpr + | @valueneexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr + | @notnullexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +callableBinding( + unique int callerid: @caller ref, + int callee: @callable ref +); + +memberRefBinding( + unique int id: @expr ref, + int callable: @callable ref +); + +propertyRefGetBinding( + unique int id: @expr ref, + int getter: @callable ref +); + +propertyRefFieldBinding( + unique int id: @expr ref, + int field: @field ref +); + +propertyRefSetBinding( + unique int id: @expr ref, + int setter: @callable ref +); + +@exprparent = @stmt | @expr | @whenbranch | @callable | @field | @fielddecl | @classorinterface | @param | @localvar | @typevariable; + +variableBinding( + unique int expr: @varaccess ref, + int variable: @variable ref +); + +@variable = @localscopevariable | @field; + +@localscopevariable = @localvar | @param; + +localvars( + unique int id: @localvar, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref +); + +localvarsKotlinType( + unique int id: @localvar ref, + int kttypeid: @kt_type ref +); + +@namedexprorstmt = @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings( + string name: string ref, + string value: string ref, + unique int parent: @namedexprorstmt ref +); + +/* + * Modules + */ + +#keyset[name] +modules( + unique int id: @module, + string name: string ref +); + +isOpen( + int id: @module ref +); + +#keyset[fileId] +cumodule( + int fileId: @file ref, + int moduleId: @module ref +); + +@directive = @requires + | @exports + | @opens + | @uses + | @provides + +#keyset[directive] +directives( + int id: @module ref, + int directive: @directive ref +); + +requires( + unique int id: @requires, + int target: @module ref +); + +isTransitive( + int id: @requires ref +); + +isStatic( + int id: @requires ref +); + +exports( + unique int id: @exports, + int target: @package ref +); + +exportsTo( + int id: @exports ref, + int target: @module ref +); + +opens( + unique int id: @opens, + int target: @package ref +); + +opensTo( + int id: @opens ref, + int target: @module ref +); + +uses( + unique int id: @uses, + string serviceInterface: string ref +); + +provides( + unique int id: @provides, + string serviceInterface: string ref +); + +providesWith( + int id: @provides ref, + string serviceImpl: string ref +); + +isNullDefaultCase( + int id: @case ref +); + +/* + * Javadoc + */ + +javadoc( + unique int id: @javadoc +); + +isNormalComment( + int commentid : @javadoc ref +); + +isEolComment( + int commentid : @javadoc ref +); + +hasJavadoc( + int documentableid: @member ref, + int javadocid: @javadoc ref +); + +#keyset[parentid,idx] +javadocTag( + unique int id: @javadocTag, + string name: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +#keyset[parentid,idx] +javadocText( + unique int id: @javadocText, + string text: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +@classorinterfaceorpackage = @classorinterface | @package; +@classorinterfaceorcallable = @classorinterface | @callable; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype | @errortype; +@classorarray = @classorinterface | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; + +/** A program element that has a name. */ +@element = @package | @modifier | @annotation | @errortype | + @locatableElement; + +@locatableElement = @file | @primitive | @classorinterface | @method | @constructor | @param | @exception | @field | + @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias | + @kt_property; + +@modifiable = @member_modifiable| @param | @localvar | @typevariable; + +@member_modifiable = @classorinterface | @method | @constructor | @field | @kt_property; + +@member = @method | @constructor | @field | @reftype ; + +/** A program element that has a location. */ +@locatable = @typebound | @javadoc | @javadocTag | @javadocText | @xmllocatable | @ktcomment | + @locatableElement; + +@top = @element | @locatable | @folder; + +/* + * 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; + +/* + * configuration files with key value pairs + */ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +ktComments( + unique int id: @ktcomment, + int kind: int ref, + string text : string ref +) + +ktCommentSections( + unique int id: @ktcommentsection, + int comment: @ktcomment ref, + string content : string ref +) + +ktCommentSectionNames( + unique int id: @ktcommentsection ref, + string name : string ref +) + +ktCommentSectionSubjectNames( + unique int id: @ktcommentsection ref, + string subjectname : string ref +) + +#keyset[id, owner] +ktCommentOwners( + int id: @ktcomment ref, + int owner: @top ref +) + +ktExtensionFunctions( + unique int id: @method ref, + int typeid: @type ref, + int kttypeid: @kt_type ref +) + +ktProperties( + unique int id: @kt_property, + string nodeName: string ref +) + +ktPropertyGetters( + unique int id: @kt_property ref, + int getter: @method ref +) + +ktPropertySetters( + unique int id: @kt_property ref, + int setter: @method ref +) + +ktPropertyBackingFields( + unique int id: @kt_property ref, + int backingField: @field ref +) + +ktSyntheticBody( + unique int id: @callable ref, + int kind: int ref + // 1: ENUM_VALUES + // 2: ENUM_VALUEOF + // 3: ENUM_ENTRIES +) + +ktLocalFunction( + unique int id: @method ref +) + +ktInitializerAssignment( + unique int id: @assignexpr ref +) + +ktPropertyDelegates( + unique int id: @kt_property ref, + unique int variableId: @variable ref +) + +/** + * If `id` is a compiler generated element, then the kind indicates the + * reason that the compiler generated it. + * See `Element.compilerGeneratedReason()` for an explanation of what + * each `kind` means. + */ +compiler_generated( + unique int id: @element ref, + int kind: int ref +) + +ktFunctionOriginalNames( + unique int id: @method ref, + string name: string ref +) + +ktDataClasses( + unique int id: @classorinterface ref +) diff --git a/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/semmlecode.dbscheme b/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/semmlecode.dbscheme new file mode 100644 index 000000000000..1b8f5f4c747e --- /dev/null +++ b/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/semmlecode.dbscheme @@ -0,0 +1,1236 @@ +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * javac A.java B.java C.java + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * javac A.java B.java C.java + */ + unique int id : @compilation, + int kind: int ref, + string cwd : string ref, + string name : string ref +); + +case @compilation.kind of + 1 = @javacompilation +| 2 = @kotlincompilation +; + +compilation_started( + int id : @compilation 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 + * + * javac A.java B.java C.java + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--javac-args` + * 2 | A.java + * 3 | B.java + * 4 | C.java + */ +#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` 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 + * + * javac A.java B.java C.java + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | A.java + * 1 | B.java + * 2 | C.java + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * For each file recorded in `compilation_compiling_files`, + * there will be a corresponding row in + * `compilation_compiling_files_completed` once extraction + * of that file is complete. The `result` will indicate the + * extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +#keyset[id, num] +compilation_compiling_files_completed( + int id : @compilation ref, + int num : int ref, + int result : int 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 +); + +/** + * The `cpu_seconds` and `elapsed_seconds` are the CPU time and elapsed + * time (respectively) that the original compilation (not the extraction) + * took for compiler invocation `id`. + */ +compilation_compiler_times( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float 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`. + * The `result` will indicate the extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref, + int result : int ref +); + +diagnostics( + unique int id: @diagnostic, + string generated_by: string ref, // TODO: Sync this with the other languages? + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/** + * 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 +); + +/* + * External artifacts + */ + +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +sourceLocationPrefix( + string prefix : string ref +); + +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path: string ref +); + +/* + * SMAP + */ + +smap_header( + int outputFileId: @file ref, + string outputFilename: string ref, + string defaultStratum: string ref +); + +smap_files( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + string inputFileName: string ref, + int inputFileId: @file ref +); + +smap_lines( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + int inputStartLine: int ref, + int inputLineCount: int ref, + int outputStartLine: int ref, + int outputLineIncrement: int ref +); + +/* + * Locations and files + */ + +@location = @location_default ; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +hasLocation( + int locatableid: @locatable ref, + int id: @location ref +); + +@sourceline = @locatable ; + +#keyset[element_id] +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int 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 +); + +/* + * Java + */ + +cupackage( + unique int id: @file ref, + int packageid: @package ref +); + +#keyset[fileid,keyName] +jarManifestMain( + int fileid: @file ref, + string keyName: string ref, + string value: string ref +); + +#keyset[fileid,entryName,keyName] +jarManifestEntries( + int fileid: @file ref, + string entryName: string ref, + string keyName: string ref, + string value: string ref +); + +packages( + unique int id: @package, + string nodeName: string ref +); + +primitives( + unique int id: @primitive, + string nodeName: string ref +); + +modifiers( + unique int id: @modifier, + string nodeName: string ref +); + +/** + * An errortype is used when the extractor is unable to extract a type + * correctly for some reason. + */ +error_type( + unique int id: @errortype +); + +classes_or_interfaces( + unique int id: @classorinterface, + string nodeName: string ref, + int parentid: @package ref, + int sourceid: @classorinterface ref +); + +file_class( + int id: @classorinterface ref +); + +class_object( + unique int id: @classorinterface ref, + unique int instance: @field ref +); + +type_companion_object( + unique int id: @classorinterface ref, + unique int instance: @field ref, + unique int companion_object: @classorinterface ref +); + +kt_nullable_types( + unique int id: @kt_nullable_type, + int classid: @reftype ref +) + +kt_notnull_types( + unique int id: @kt_notnull_type, + int classid: @reftype ref +) + +kt_type_alias( + unique int id: @kt_type_alias, + string name: string ref, + int kttypeid: @kt_type ref +) + +@kt_type = @kt_nullable_type | @kt_notnull_type + +isInterface( + unique int id: @classorinterface ref +); + +isRecord( + unique int id: @classorinterface ref +); + +fielddecls( + unique int id: @fielddecl, + int parentid: @reftype ref +); + +#keyset[fieldId] #keyset[fieldDeclId,pos] +fieldDeclaredIn( + int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref +); + +fields( + unique int id: @field, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref +); + +fieldsKotlinType( + unique int id: @field ref, + int kttypeid: @kt_type ref +); + +constrs( + unique int id: @constructor, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref +); + +constrsKotlinType( + unique int id: @constructor ref, + int kttypeid: @kt_type ref +); + +methods( + unique int id: @method, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref +); + +methodsKotlinType( + unique int id: @method ref, + int kttypeid: @kt_type ref +); + +#keyset[parentid,pos] +params( + unique int id: @param, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref +); + +paramsKotlinType( + unique int id: @param ref, + int kttypeid: @kt_type ref +); + +paramName( + unique int id: @param ref, + string nodeName: string ref +); + +isVarargsParam( + int param: @param ref +); + +exceptions( + unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref +); + +isAnnotType( + int interfaceid: @classorinterface ref +); + +isAnnotElem( + int methodid: @method ref +); + +annotValue( + int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref +); + +isEnumType( + int classid: @classorinterface ref +); + +isEnumConst( + int fieldid: @field ref +); + +#keyset[parentid,pos] +typeVars( + unique int id: @typevariable, + string nodeName: string ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +wildcards( + unique int id: @wildcard, + string nodeName: string ref, + int kind: int ref +); + +#keyset[parentid,pos] +typeBounds( + unique int id: @typebound, + int typeid: @reftype ref, + int pos: int ref, + int parentid: @boundedtype ref +); + +#keyset[parentid,pos] +typeArgs( + int argumentid: @reftype ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +isParameterized( + int memberid: @member ref +); + +isRaw( + int memberid: @member ref +); + +#keyset[classid] #keyset[parent] +isAnonymClass( + int classid: @classorinterface ref, + int parent: @classinstancexpr ref +); + +#keyset[typeid] #keyset[parent] +isLocalClassOrInterface( + int typeid: @classorinterface ref, + int parent: @localtypedeclstmt ref +); + +isDefConstr( + int constructorid: @constructor ref +); + +#keyset[exprId] +lambdaKind( + int exprId: @lambdaexpr ref, + int bodyKind: int ref +); + +isCanonicalConstr( + int constructorid: @constructor ref +); + +arrays( + unique int id: @array, + string nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref +); + +enclInReftype( + unique int child: @reftype ref, + int parent: @reftype ref +); + +extendsReftype( + int id1: @reftype ref, + int id2: @classorinterface ref +); + +implInterface( + int id1: @classorarray ref, + int id2: @classorinterface ref +); + +permits( + int id1: @classorinterface ref, + int id2: @classorinterface ref +); + +hasModifier( + int id1: @modifiable ref, + int id2: @modifier ref +); + +imports( + unique int id: @import, + int holder: @classorinterfaceorpackage ref, + string name: string ref, + int kind: int ref +); + +#keyset[parent,idx] +stmts( + unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref +); + +@stmtparent = @callable | @stmt | @switchexpr | @whenexpr| @stmtexpr; + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localtypedeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause +| 23 = @yieldstmt +| 24 = @errorstmt +| 25 = @whenbranch +; + +#keyset[parent,idx] +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @exprparent ref, + int idx: int ref +); + +exprsKotlinType( + unique int id: @expr ref, + int kttypeid: @kt_type ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +isParenthesized( + unique int id: @expr ref, + int parentheses: int ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @newexpr +| 53 = @conditionalexpr +| 54 = @parexpr // deprecated +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @unannotatedtypeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @declannotation +| 67 = @uniontypeaccess +| 68 = @lambdaexpr +| 69 = @memberref +| 70 = @annotatedtypeaccess +| 71 = @typeannotation +| 72 = @intersectiontypeaccess +| 73 = @switchexpr +| 74 = @errorexpr +| 75 = @whenexpr +| 76 = @getclassexpr +| 77 = @safecastexpr +| 78 = @implicitcastexpr +| 79 = @implicitnotnullexpr +| 80 = @implicitcoerciontounitexpr +| 81 = @notinstanceofexpr +| 82 = @stmtexpr +| 83 = @stringtemplateexpr +| 84 = @notnullexpr +| 85 = @unsafecoerceexpr +| 86 = @valueeqexpr +| 87 = @valueneexpr +| 88 = @propertyref +| 89 = @recordpatternexpr +; + +/** Holds if this `when` expression was written as an `if` expression. */ +when_if(unique int id: @whenexpr ref); + +/** Holds if this `when` branch was written as an `else` branch. */ +when_branch_else(unique int id: @whenbranch ref); + +@classinstancexpr = @newexpr | @lambdaexpr | @memberref | @propertyref + +@annotation = @declannotation | @typeannotation +@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr + | @valueeqexpr + | @valueneexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr + | @notnullexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +callableBinding( + unique int callerid: @caller ref, + int callee: @callable ref +); + +memberRefBinding( + unique int id: @expr ref, + int callable: @callable ref +); + +propertyRefGetBinding( + unique int id: @expr ref, + int getter: @callable ref +); + +propertyRefFieldBinding( + unique int id: @expr ref, + int field: @field ref +); + +propertyRefSetBinding( + unique int id: @expr ref, + int setter: @callable ref +); + +@exprparent = @stmt | @expr | @whenbranch | @callable | @field | @fielddecl | @classorinterface | @param | @localvar | @typevariable; + +variableBinding( + unique int expr: @varaccess ref, + int variable: @variable ref +); + +@variable = @localscopevariable | @field; + +@localscopevariable = @localvar | @param; + +localvars( + unique int id: @localvar, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref +); + +localvarsKotlinType( + unique int id: @localvar ref, + int kttypeid: @kt_type ref +); + +@namedexprorstmt = @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings( + string name: string ref, + string value: string ref, + unique int parent: @namedexprorstmt ref +); + +/* + * Modules + */ + +#keyset[name] +modules( + unique int id: @module, + string name: string ref +); + +isOpen( + int id: @module ref +); + +#keyset[fileId] +cumodule( + int fileId: @file ref, + int moduleId: @module ref +); + +@directive = @requires + | @exports + | @opens + | @uses + | @provides + +#keyset[directive] +directives( + int id: @module ref, + int directive: @directive ref +); + +requires( + unique int id: @requires, + int target: @module ref +); + +isTransitive( + int id: @requires ref +); + +isStatic( + int id: @requires ref +); + +exports( + unique int id: @exports, + int target: @package ref +); + +exportsTo( + int id: @exports ref, + int target: @module ref +); + +opens( + unique int id: @opens, + int target: @package ref +); + +opensTo( + int id: @opens ref, + int target: @module ref +); + +uses( + unique int id: @uses, + string serviceInterface: string ref +); + +provides( + unique int id: @provides, + string serviceInterface: string ref +); + +providesWith( + int id: @provides ref, + string serviceImpl: string ref +); + +isNullDefaultCase( + int id: @case ref +); + +/* + * Javadoc + */ + +javadoc( + unique int id: @javadoc +); + +isNormalComment( + int commentid : @javadoc ref +); + +isEolComment( + int commentid : @javadoc ref +); + +hasJavadoc( + int documentableid: @member ref, + int javadocid: @javadoc ref +); + +#keyset[parentid,idx] +javadocTag( + unique int id: @javadocTag, + string name: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +#keyset[parentid,idx] +javadocText( + unique int id: @javadocText, + string text: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +@classorinterfaceorpackage = @classorinterface | @package; +@classorinterfaceorcallable = @classorinterface | @callable; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype | @errortype; +@classorarray = @classorinterface | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; + +/** A program element that has a name. */ +@element = @package | @modifier | @annotation | @errortype | + @locatableElement; + +@locatableElement = @file | @primitive | @classorinterface | @method | @constructor | @param | @exception | @field | + @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias | + @kt_property; + +@modifiable = @member_modifiable| @param | @localvar | @typevariable; + +@member_modifiable = @classorinterface | @method | @constructor | @field | @kt_property; + +@member = @method | @constructor | @field | @reftype ; + +/** A program element that has a location. */ +@locatable = @typebound | @javadoc | @javadocTag | @javadocText | @xmllocatable | @ktcomment | + @locatableElement; + +@top = @element | @locatable | @folder; + +/* + * 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; + +/* + * configuration files with key value pairs + */ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +ktComments( + unique int id: @ktcomment, + int kind: int ref, + string text : string ref +) + +ktCommentSections( + unique int id: @ktcommentsection, + int comment: @ktcomment ref, + string content : string ref +) + +ktCommentSectionNames( + unique int id: @ktcommentsection ref, + string name : string ref +) + +ktCommentSectionSubjectNames( + unique int id: @ktcommentsection ref, + string subjectname : string ref +) + +#keyset[id, owner] +ktCommentOwners( + int id: @ktcomment ref, + int owner: @top ref +) + +ktExtensionFunctions( + unique int id: @method ref, + int typeid: @type ref, + int kttypeid: @kt_type ref +) + +ktProperties( + unique int id: @kt_property, + string nodeName: string ref +) + +ktPropertyGetters( + unique int id: @kt_property ref, + int getter: @method ref +) + +ktPropertySetters( + unique int id: @kt_property ref, + int setter: @method ref +) + +ktPropertyBackingFields( + unique int id: @kt_property ref, + int backingField: @field ref +) + +ktSyntheticBody( + unique int id: @callable ref, + int kind: int ref + // 1: ENUM_VALUES + // 2: ENUM_VALUEOF + // 3: ENUM_ENTRIES +) + +ktLocalFunction( + unique int id: @method ref +) + +ktInitializerAssignment( + unique int id: @assignexpr ref +) + +ktPropertyDelegates( + unique int id: @kt_property ref, + unique int variableId: @variable ref +) + +/** + * If `id` is a compiler generated element, then the kind indicates the + * reason that the compiler generated it. + * See `Element.compilerGeneratedReason()` for an explanation of what + * each `kind` means. + */ +compiler_generated( + unique int id: @element ref, + int kind: int ref +) + +ktFunctionOriginalNames( + unique int id: @method ref, + string name: string ref +) + +ktDataClasses( + unique int id: @classorinterface ref +) diff --git a/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/upgrade.properties b/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/upgrade.properties new file mode 100644 index 000000000000..cfc9417d13e2 --- /dev/null +++ b/java/downgrades/9f6026c400996c13842974b24f076a486ad1f69c/upgrade.properties @@ -0,0 +1,3 @@ +description: Remove Java 25 compact source files support by removing `isImplicitClass` table +compatibility: partial +isImplicitClass.rel: delete diff --git a/java/ql/integration-tests/java/buildless-erroneous/DatabaseQualityDiagnostics.expected b/java/ql/integration-tests/java/buildless-erroneous/DatabaseQualityDiagnostics.expected index e50a800d25c3..a22cf324a384 100644 --- a/java/ql/integration-tests/java/buildless-erroneous/DatabaseQualityDiagnostics.expected +++ b/java/ql/integration-tests/java/buildless-erroneous/DatabaseQualityDiagnostics.expected @@ -1,6 +1,6 @@ diagnosticAttributes -| Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityCliSummaryTable | true | -| Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityStatusPage | true | -| Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityTelemetry | true | +| Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 20 % (threshold 85 %). Percentage of expressions with known type: 14 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityCliSummaryTable | true | +| Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 20 % (threshold 85 %). Percentage of expressions with known type: 14 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityStatusPage | true | +| Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 20 % (threshold 85 %). Percentage of expressions with known type: 14 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | visibilityTelemetry | true | #select -| Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | 1 | +| Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 20 % (threshold 85 %). Percentage of expressions with known type: 14 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | Scanning Java code completed successfully, but the scan encountered issues. This may be caused by problems identifying dependencies or use of generated source code. Some metrics of the database quality are: Percentage of calls with call target: 20 % (threshold 85 %). Percentage of expressions with known type: 14 % (threshold 85 %). Ideally these metrics should be above their thresholds. Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning Java using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes). | 1 | diff --git a/java/ql/integration-tests/java/buildless-erroneous/ExtractorInformation.expected b/java/ql/integration-tests/java/buildless-erroneous/ExtractorInformation.expected index 0a45568a5365..b43963e4aca8 100644 --- a/java/ql/integration-tests/java/buildless-erroneous/ExtractorInformation.expected +++ b/java/ql/integration-tests/java/buildless-erroneous/ExtractorInformation.expected @@ -1,4 +1,4 @@ -| Annotation processors enabled: true | 1 | +| Annotation processors enabled: false | 1 | | Number of calls with call target | 1 | | Number of calls with missing call target | 4 | | Number of diagnostics from CodeQL Java extractor with severity 5 | 10 | @@ -15,5 +15,3 @@ | Total number of diagnostics from CodeQL Java extractor | 12 | | Total number of lines | 13 | | Total number of lines with extension java | 13 | -| Used annotation processor: lombok.launch.AnnotationProcessorHider$AnnotationProcessor | 1 | -| Used annotation processor: lombok.launch.AnnotationProcessorHider$ClaimingProcessor | 1 | diff --git a/java/ql/lib/CHANGELOG.md b/java/ql/lib/CHANGELOG.md index 448b04bdc24e..a6b4649e42ee 100644 --- a/java/ql/lib/CHANGELOG.md +++ b/java/ql/lib/CHANGELOG.md @@ -1,3 +1,18 @@ +## 7.7.0 + +### New Features + +* The Java extractor and QL libraries now support Java 25. +* Added support for Java 25 compact source files (JEP 512). The new predicate `Class.isImplicit()` identifies classes that are implicitly declared when using compact source files, and the new predicate `CompilationUnit.isCompactSourceFile()` identifies compilation units that contain compact source files. +* Added support for Java 25 module import declarations. +* Add `ModuleImportDeclaration` class. + +### Minor Analysis Improvements + +* Improved support for various assertion libraries, in particular JUnit. This affects the control-flow graph slightly, and in turn affects several queries (mainly quality queries). Most queries should see improved precision (new true positives and fewer false positives), in particular `java/constant-comparison`, `java/index-out-of-bounds`, `java/dereferenced-value-may-be-null`, and `java/useless-null-check`. Some medium precision queries like `java/toctou-race-condition` and `java/unreleased-lock` may see mixed result changes (both slight improvements and slight regressions). +* Added taint flow model for `java.crypto.KDF`. +* Added taint flow model for `java.lang.ScopedValue`. + ## 7.6.1 No user-facing changes. diff --git a/java/ql/lib/change-notes/released/7.7.0.md b/java/ql/lib/change-notes/released/7.7.0.md new file mode 100644 index 000000000000..f33b45cd74d8 --- /dev/null +++ b/java/ql/lib/change-notes/released/7.7.0.md @@ -0,0 +1,14 @@ +## 7.7.0 + +### New Features + +* The Java extractor and QL libraries now support Java 25. +* Added support for Java 25 compact source files (JEP 512). The new predicate `Class.isImplicit()` identifies classes that are implicitly declared when using compact source files, and the new predicate `CompilationUnit.isCompactSourceFile()` identifies compilation units that contain compact source files. +* Added support for Java 25 module import declarations. +* Add `ModuleImportDeclaration` class. + +### Minor Analysis Improvements + +* Improved support for various assertion libraries, in particular JUnit. This affects the control-flow graph slightly, and in turn affects several queries (mainly quality queries). Most queries should see improved precision (new true positives and fewer false positives), in particular `java/constant-comparison`, `java/index-out-of-bounds`, `java/dereferenced-value-may-be-null`, and `java/useless-null-check`. Some medium precision queries like `java/toctou-race-condition` and `java/unreleased-lock` may see mixed result changes (both slight improvements and slight regressions). +* Added taint flow model for `java.crypto.KDF`. +* Added taint flow model for `java.lang.ScopedValue`. diff --git a/java/ql/lib/codeql-pack.release.yml b/java/ql/lib/codeql-pack.release.yml index 0e73c8335724..5c876a864fc2 100644 --- a/java/ql/lib/codeql-pack.release.yml +++ b/java/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 7.6.1 +lastReleaseVersion: 7.7.0 diff --git a/java/ql/lib/config/semmlecode.dbscheme b/java/ql/lib/config/semmlecode.dbscheme index 1b8f5f4c747e..9f6026c40099 100644 --- a/java/ql/lib/config/semmlecode.dbscheme +++ b/java/ql/lib/config/semmlecode.dbscheme @@ -537,6 +537,10 @@ isLocalClassOrInterface( int parent: @localtypedeclstmt ref ); +isImplicitClass( + unique int classid: @classorinterface ref +); + isDefConstr( int constructorid: @constructor ref ); diff --git a/java/ql/lib/config/semmlecode.dbscheme.stats b/java/ql/lib/config/semmlecode.dbscheme.stats index 650c4649439d..d530051f3a45 100644 --- a/java/ql/lib/config/semmlecode.dbscheme.stats +++ b/java/ql/lib/config/semmlecode.dbscheme.stats @@ -13986,6 +13986,17 @@ + + isImplicitClass + 4 + + + classid + 4 + + + + isDefConstr 139376 diff --git a/java/ql/lib/ext/java.lang.scoped.model.yml b/java/ql/lib/ext/java.lang.scoped.model.yml new file mode 100644 index 000000000000..3eeae5a5b1f6 --- /dev/null +++ b/java/ql/lib/ext/java.lang.scoped.model.yml @@ -0,0 +1,19 @@ +extensions: + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["java.lang", "ScopedValue", False, "where", "(ScopedValue,Object)", "", "Argument[1]", "Argument[0].SyntheticField[java.lang.ScopedValue.boundValue]", "value", "manual"] + - ["java.lang", "ScopedValue", True, "get", "()", "", "Argument[this].SyntheticField[java.lang.ScopedValue.boundValue]", "ReturnValue", "value", "manual"] + - ["java.lang", "ScopedValue", False, "where", "(ScopedValue,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.lang", "ScopedValue$Carrier", False, "where", "(ScopedValue,Object)", "", "Argument[1]", "Argument[0].SyntheticField[java.lang.ScopedValue.boundValue]", "value", "manual"] + - ["java.lang", "ScopedValue$Carrier", False, "where", "(ScopedValue,Object)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["java.lang", "ScopedValue$Carrier", False, "run", "(Runnable)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["java.lang", "ScopedValue$Carrier", False, "call", "(Callable)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + + - addsTo: + pack: codeql/java-all + extensible: neutralModel + data: + - ["java.lang", "ScopedValue", "newInstance", "()", "summary", "manual"] + - ["java.lang", "ScopedValue", "isBound", "()", "summary", "manual"] \ No newline at end of file diff --git a/java/ql/lib/ext/javax.crypto.model.yml b/java/ql/lib/ext/javax.crypto.model.yml index 2b3bfc1abe85..0a2d43fce17f 100644 --- a/java/ql/lib/ext/javax.crypto.model.yml +++ b/java/ql/lib/ext/javax.crypto.model.yml @@ -7,6 +7,21 @@ extensions: - ["javax.crypto", "Cipher", True, "init", "(int,Key,AlgorithmParameterSpec,SecureRandom)", "", "Argument[2]", "encryption-iv", "manual"] - ["javax.crypto", "Cipher", False, "unwrap", "(byte[],String,int)", "", "Argument[0]", "credentials-key", "hq-generated"] - ["javax.crypto", "CipherSpi", True, "engineUnwrap", "(byte[],String,int)", "", "Argument[0]", "credentials-key", "hq-generated"] + - addsTo: + pack: codeql/java-all + extensible: summaryModel + data: + - ["javax.crypto", "KDF", False, "getInstance", "(String)", "", "Argument[0]", "ReturnValue.SyntheticField[javax.crypto.KDF.algorithm]", "value", "manual"] + - ["javax.crypto", "KDF", False, "getInstance", "(String,Provider)", "", "Argument[0]", "ReturnValue.SyntheticField[javax.crypto.KDF.algorithm]", "value", "manual"] + - ["javax.crypto", "KDF", False, "getInstance", "(String,String)", "", "Argument[0]", "ReturnValue.SyntheticField[javax.crypto.KDF.algorithm]", "value", "manual"] + - ["javax.crypto", "KDF", False, "getInstance", "(String,KDFParameters)", "", "Argument[0]", "ReturnValue.SyntheticField[javax.crypto.KDF.algorithm]", "value", "manual"] + - ["javax.crypto", "KDF", False, "getInstance", "(String,KDFParameters,Provider)", "", "Argument[0]", "ReturnValue.SyntheticField[javax.crypto.KDF.algorithm]", "value", "manual"] + - ["javax.crypto", "KDF", False, "getInstance", "(String,KDFParameters,String)", "", "Argument[0]", "ReturnValue.SyntheticField[javax.crypto.KDF.algorithm]", "value", "manual"] + - ["javax.crypto", "KDF", True, "getAlgorithm", "()", "", "Argument[this].SyntheticField[javax.crypto.KDF.algorithm]", "ReturnValue", "value", "manual"] + - ["javax.crypto", "KDF", True, "getProvider", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["javax.crypto", "KDF", True, "deriveKey", "(String,AlgorithmParameterSpec)", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["javax.crypto", "KDF", True, "deriveData", "(AlgorithmParameterSpec)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["javax.crypto", "SecretKey", True, "getEncoded", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - addsTo: pack: codeql/java-all extensible: neutralModel diff --git a/java/ql/lib/ext/javax.crypto.spec.model.yml b/java/ql/lib/ext/javax.crypto.spec.model.yml index d2b7dbc99b8d..e51c27c5088e 100644 --- a/java/ql/lib/ext/javax.crypto.spec.model.yml +++ b/java/ql/lib/ext/javax.crypto.spec.model.yml @@ -7,6 +7,21 @@ extensions: - ["javax.crypto.spec", "GCMParameterSpec", True, "GCMParameterSpec", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] - ["javax.crypto.spec", "RC2ParameterSpec", True, "RC2ParameterSpec", "", "", "Argument[1]", "Argument[this]", "taint", "manual"] - ["javax.crypto.spec", "RC5ParameterSpec", True, "RC5ParameterSpec", "", "", "Argument[3]", "Argument[this]", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "addIKM", "(byte[])", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "addIKM", "(byte[])", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "addIKM", "(SecretKey)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "addIKM", "(SecretKey)", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "addSalt", "(byte[])", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "addSalt", "(byte[])", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "addSalt", "(SecretKey)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "addSalt", "(SecretKey)", "", "Argument[this]", "ReturnValue", "value", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "thenExpand", "(byte[],int)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "thenExpand", "(byte[],int)", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec$Builder", True, "thenExpand", "(byte[],int)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec", False, "expandOnly", "(SecretKey,byte[],int)", "", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["javax.crypto.spec", "HKDFParameterSpec", False, "expandOnly", "(SecretKey,byte[],int)", "", "Argument[1]", "ReturnValue", "taint", "manual"] + - ["javax.crypto.spec", "SecretKeySpec", False, "SecretKeySpec", "(byte[],String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] + - ["javax.crypto.spec", "SecretKeySpec", False, "SecretKeySpec", "(byte[],int,int,String)", "", "Argument[0]", "Argument[this]", "taint", "manual"] - addsTo: pack: codeql/java-all extensible: sinkModel diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 4ae667d82337..00d60ce96ba0 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 7.6.1 +version: 7.7.0 groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/lib/semmle/code/java/CompilationUnit.qll b/java/ql/lib/semmle/code/java/CompilationUnit.qll index 546c3d26ea39..5b26828b47c0 100644 --- a/java/ql/lib/semmle/code/java/CompilationUnit.qll +++ b/java/ql/lib/semmle/code/java/CompilationUnit.qll @@ -33,5 +33,13 @@ class CompilationUnit extends Element, File { */ Module getModule() { cumodule(this, result) } + /** + * Holds if this compilation unit represents a compact source file. + * A compact source file contains an implicitly declared top-level class. + */ + predicate isCompactSourceFile() { + exists(Class c | c.getCompilationUnit() = this and c.isImplicit()) + } + override string getAPrimaryQlClass() { result = "CompilationUnit" } } diff --git a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll index c1c19fa44508..a31101888da3 100644 --- a/java/ql/lib/semmle/code/java/ControlFlowGraph.qll +++ b/java/ql/lib/semmle/code/java/ControlFlowGraph.qll @@ -82,6 +82,7 @@ module; */ import java +private import codeql.controlflow.SuccessorType private import codeql.util.Boolean private import Completion private import controlflow.internal.Preconditions @@ -124,6 +125,28 @@ module ControlFlow { result = succ(this, NormalCompletion()) } + /** Gets an immediate successor of this node of a given type, if any. */ + Node getASuccessor(SuccessorType t) { + result = branchSuccessor(this, t.(BooleanSuccessor).getValue()) + or + exists(Completion completion | + result = succ(this, completion) and + not result = branchSuccessor(this, _) + | + completion = NormalCompletion() and t instanceof DirectSuccessor + or + completion = ReturnCompletion() and t instanceof ReturnSuccessor + or + completion = BreakCompletion(_) and t instanceof BreakSuccessor + or + completion = YieldCompletion(_) and t instanceof BreakSuccessor + or + completion = ContinueCompletion(_) and t instanceof ContinueSuccessor + or + completion = ThrowCompletion(_) and t instanceof ExceptionSuccessor + ) + } + /** Gets the basic block that contains this node. */ BasicBlock getBasicBlock() { result.getANode() = this } @@ -365,10 +388,10 @@ private module ControlFlowGraphImpl { * Bind `t` to an unchecked exception that may occur in a precondition check or guard wrapper. */ private predicate uncheckedExceptionFromMethod(MethodCall ma, ThrowableType t) { - conditionCheckArgument(ma, _, _) and + (methodCallChecksArgument(ma) or methodCallUnconditionallyThrows(ma)) and (t instanceof TypeError or t instanceof TypeRuntimeException) or - methodMayThrow(ma.getMethod(), t) + methodMayThrow(ma.getMethod().getSourceDeclaration(), t) } /** @@ -586,6 +609,7 @@ private module ControlFlowGraphImpl { * Gets a `MethodCall` that always throws an exception or calls `exit`. */ private MethodCall nonReturningMethodCall() { + methodCallUnconditionallyThrows(result) or result.getMethod().getSourceDeclaration() = nonReturningMethod() or result = likelyNonReturningMethod().getAnAccess() } diff --git a/java/ql/lib/semmle/code/java/Import.qll b/java/ql/lib/semmle/code/java/Import.qll index aed041155555..034807277350 100644 --- a/java/ql/lib/semmle/code/java/Import.qll +++ b/java/ql/lib/semmle/code/java/Import.qll @@ -154,3 +154,35 @@ class ImportStaticTypeMember extends Import { override string getAPrimaryQlClass() { result = "ImportStaticTypeMember" } } + +/** + * A module import declaration, which imports an entire module. + * + * For example, `import module java.base;` makes all packages exported + * by the `java.base` module available, and through those packages, + * the types they declare become accessible. + */ +class ModuleImportDeclaration extends Import { + ModuleImportDeclaration() { imports(this, _, _, 6) } + + /** Gets the name of the imported module. */ + string getModuleName() { imports(this, _, result, _) } + + /** Gets the imported module. */ + Module getModule() { result.getName() = this.getModuleName() } + + /** Gets an exported package from the imported module. */ + Package getAnImportedPackage() { + exists(ExportsDirective exports | + exports = this.getModule().getADirective() and + result = exports.getExportedPackage() + ) + } + + /** Gets a type from a package that is accessible through this module import. */ + RefType getAnImportedType() { result.getPackage() = this.getAnImportedPackage() } + + override string toString() { result = "import module " + this.getModuleName() } + + override string getAPrimaryQlClass() { result = "ModuleImportDeclaration" } +} diff --git a/java/ql/lib/semmle/code/java/Member.qll b/java/ql/lib/semmle/code/java/Member.qll index 7d84dbd379d0..17fe696972f6 100644 --- a/java/ql/lib/semmle/code/java/Member.qll +++ b/java/ql/lib/semmle/code/java/Member.qll @@ -848,6 +848,9 @@ class Field extends Member, ExprParent, @field, Variable { override string getAPrimaryQlClass() { result = "Field" } } +overlay[local] +private class DiscardableField extends DiscardableReferableLocatable, @field { } + /** An instance field. */ class InstanceField extends Field { InstanceField() { not this.isStatic() } diff --git a/java/ql/lib/semmle/code/java/Type.qll b/java/ql/lib/semmle/code/java/Type.qll index dd646e74285c..ef5cc5d941ce 100644 --- a/java/ql/lib/semmle/code/java/Type.qll +++ b/java/ql/lib/semmle/code/java/Type.qll @@ -15,6 +15,7 @@ module; import Member import Modifier import JDK +private import semmle.code.java.Overlay /** * Holds if reference type `t` is an immediate super-type of `sub`. @@ -699,6 +700,15 @@ class Class extends ClassOrInterface { /** Holds if this class is an anonymous class. */ predicate isAnonymous() { isAnonymClass(this.getSourceDeclaration(), _) } + /** Holds if this class is an implicit class (compact source file). */ + predicate isImplicit() { isImplicitClass(this.getSourceDeclaration()) } + + /** Holds if this is an auxiliary program element generated by the compiler. */ + override predicate isCompilerGenerated() { + super.isCompilerGenerated() or + this.isImplicit() + } + /** * Gets an annotation that applies to this class. * @@ -998,6 +1008,10 @@ class ClassOrInterface extends RefType, @classorinterface { CompanionObject getCompanionObject() { type_companion_object(this, _, result) } } +overlay[local] +private class DiscardableClassOrInterface extends DiscardableReferableLocatable, @classorinterface { +} + private string getAPublicObjectMethodSignature() { exists(Method m | m.getDeclaringType() instanceof TypeObject and diff --git a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll index 1657a81816f8..f214cbbd0b1a 100644 --- a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll +++ b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll @@ -7,10 +7,9 @@ module; import java import Dominance private import codeql.controlflow.BasicBlock as BB +private import codeql.controlflow.SuccessorType private module Input implements BB::InputSig { - import SuccessorType - /** Hold if `t` represents a conditional successor type. */ predicate successorTypeIsCondition(SuccessorType t) { none() } @@ -23,20 +22,8 @@ private module Input implements BB::InputSig { /** Gets the CFG scope in which this node occurs. */ CfgScope nodeGetCfgScope(Node node) { node.getEnclosingCallable() = result } - private Node getASpecificSuccessor(Node node, SuccessorType t) { - node.(ConditionNode).getABranchSuccessor(t.(BooleanSuccessor).getValue()) = result - or - node.getAnExceptionSuccessor() = result and t instanceof ExceptionSuccessor - } - /** Gets an immediate successor of this node. */ - Node nodeGetASuccessor(Node node, SuccessorType t) { - result = getASpecificSuccessor(node, t) - or - node.getASuccessor() = result and - t instanceof NormalSuccessor and - not result = getASpecificSuccessor(node, _) - } + Node nodeGetASuccessor(Node node, SuccessorType t) { result = node.getASuccessor(t) } /** * Holds if `node` represents an entry node to be used when calculating @@ -96,7 +83,7 @@ class BasicBlock extends BbImpl::BasicBlock { predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } /** Gets an immediate successor of this basic block of a given type, if any. */ - BasicBlock getASuccessor(Input::SuccessorType t) { result = super.getASuccessor(t) } + BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } BasicBlock getASuccessor() { result = super.getASuccessor() } @@ -161,8 +148,6 @@ private class BasicBlockAlias = BasicBlock; module Cfg implements BB::CfgSig { class ControlFlowNode = BbImpl::ControlFlowNode; - class SuccessorType = BbImpl::SuccessorType; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock extends BasicBlock instanceof BbImpl::EntryBasicBlock { } diff --git a/java/ql/lib/semmle/code/java/controlflow/ControlFlow.qll b/java/ql/lib/semmle/code/java/controlflow/ControlFlow.qll new file mode 100644 index 000000000000..3d2a8d7fdd1f --- /dev/null +++ b/java/ql/lib/semmle/code/java/controlflow/ControlFlow.qll @@ -0,0 +1,60 @@ +/** + * Provides an implementation of local (intraprocedural) control flow reachability. + */ +overlay[local?] +module; + +import java +private import codeql.controlflow.ControlFlow +private import semmle.code.java.dataflow.SSA as SSA +private import semmle.code.java.controlflow.Guards as Guards + +private module ControlFlowInput implements InputSig { + private import java as J + + AstNode getEnclosingAstNode(ControlFlowNode node) { node.getAstNode() = result } + + class AstNode = ExprParent; + + AstNode getParent(AstNode node) { + result = node.(Expr).getParent() or + result = node.(Stmt).getParent() + } + + class FinallyBlock extends AstNode { + FinallyBlock() { any(TryStmt try).getFinally() = this } + } + + class Expr = J::Expr; + + class SourceVariable = SSA::SsaSourceVariable; + + class SsaDefinition = SSA::SsaVariable; + + class SsaWriteDefinition extends SsaDefinition instanceof SSA::SsaExplicitUpdate { + Expr getDefinition() { + super.getDefiningExpr().(VariableAssign).getSource() = result or + super.getDefiningExpr().(AssignOp) = result + } + } + + class SsaPhiNode = SSA::SsaPhiNode; + + class SsaUncertainDefinition extends SsaDefinition instanceof SSA::SsaUncertainImplicitUpdate { + SsaDefinition getPriorDefinition() { result = super.getPriorDef() } + } + + class GuardValue = Guards::GuardValue; + + predicate ssaControlsBranchEdge(SsaDefinition def, BasicBlock bb1, BasicBlock bb2, GuardValue v) { + Guards::Guards_v3::ssaControlsBranchEdge(def, bb1, bb2, v) + } + + predicate ssaControls(SsaDefinition def, BasicBlock bb, GuardValue v) { + Guards::Guards_v3::ssaControls(def, bb, v) + } + + import Guards::Guards_v3::InternalUtil +} + +module ControlFlow = Make; diff --git a/java/ql/lib/semmle/code/java/controlflow/Guards.qll b/java/ql/lib/semmle/code/java/controlflow/Guards.qll index 041050e23966..ac46a2a25b72 100644 --- a/java/ql/lib/semmle/code/java/controlflow/Guards.qll +++ b/java/ql/lib/semmle/code/java/controlflow/Guards.qll @@ -139,10 +139,6 @@ private predicate isNonFallThroughPredecessor(SwitchCase sc, ControlFlowNode pre ) } -private module SuccessorTypes implements SharedGuards::SuccessorTypesSig { - import SuccessorType -} - private module GuardsInput implements SharedGuards::InputSig { private import java as J private import semmle.code.java.dataflow.internal.BaseSSA @@ -379,7 +375,7 @@ private module GuardsInput implements SharedGuards::InputSig; +private module GuardsImpl = SharedGuards::Make; private module LogicInputCommon { private import semmle.code.java.dataflow.NullGuards as NullGuards @@ -399,11 +395,13 @@ private module LogicInputCommon { predicate additionalImpliesStep( GuardsImpl::PreGuard g1, GuardValue v1, GuardsImpl::PreGuard g2, GuardValue v2 ) { - exists(MethodCall check, int argIndex | + exists(MethodCall check | g1 = check and - v1.getDualValue().isThrowsException() and - conditionCheckArgument(check, argIndex, v2.asBooleanValue()) and - g2 = check.getArgument(argIndex) + v1.getDualValue().isThrowsException() + | + methodCallChecksBoolean(check, g2, v2.asBooleanValue()) + or + methodCallChecksNotNull(check, g2) and v2.isNonNullValue() ) } } diff --git a/java/ql/lib/semmle/code/java/controlflow/SuccessorType.qll b/java/ql/lib/semmle/code/java/controlflow/SuccessorType.qll deleted file mode 100644 index feabc47552f3..000000000000 --- a/java/ql/lib/semmle/code/java/controlflow/SuccessorType.qll +++ /dev/null @@ -1,74 +0,0 @@ -/** - * Provides different types of control flow successor types. - */ -overlay[local?] -module; - -import java -private import codeql.util.Boolean - -private newtype TSuccessorType = - TNormalSuccessor() or - TBooleanSuccessor(Boolean branch) or - TExceptionSuccessor() - -/** The type of a control flow successor. */ -class SuccessorType extends TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { result = "SuccessorType" } -} - -/** A normal control flow successor. */ -class NormalSuccessor extends SuccessorType, TNormalSuccessor { } - -/** - * An exceptional control flow successor. - * - * This marks control flow edges that are taken when an exception is thrown. - */ -class ExceptionSuccessor extends SuccessorType, TExceptionSuccessor { } - -/** - * A conditional control flow successor. - * - * This currently only includes boolean successors (`BooleanSuccessor`). - */ -class ConditionalSuccessor extends SuccessorType, TBooleanSuccessor { - /** Gets the Boolean value of this successor. */ - boolean getValue() { this = TBooleanSuccessor(result) } -} - -/** - * A Boolean control flow successor. - * - * For example, this program fragment: - * - * ```java - * if (x < 0) - * return 0; - * else - * return 1; - * ``` - * - * has a control flow graph containing Boolean successors: - * - * ``` - * if - * | - * x < 0 - * / \ - * / \ - * / \ - * true false - * | \ - * return 0 return 1 - * ``` - */ -class BooleanSuccessor = ConditionalSuccessor; - -/** - * A nullness control flow successor. This is currently unused for Java. - */ -class NullnessSuccessor extends ConditionalSuccessor { - NullnessSuccessor() { none() } -} diff --git a/java/ql/lib/semmle/code/java/controlflow/internal/Preconditions.qll b/java/ql/lib/semmle/code/java/controlflow/internal/Preconditions.qll index a0d2e4ef03ec..cc8ee539a5b1 100644 --- a/java/ql/lib/semmle/code/java/controlflow/internal/Preconditions.qll +++ b/java/ql/lib/semmle/code/java/controlflow/internal/Preconditions.qll @@ -1,5 +1,5 @@ /** - * Provides predicates for identifying precondition checks like + * Provides predicates for identifying precondition and assertion checks like * `com.google.common.base.Preconditions` and * `org.apache.commons.lang3.Validate`. */ @@ -9,99 +9,150 @@ module; import java /** - * Holds if `m` is a non-overridable method that checks that its zero-indexed `argument` - * is equal to `checkTrue` and throws otherwise. + * Holds if `m` is a method that checks that its argument at position `arg` is + * equal to true and throws otherwise. */ -predicate conditionCheckMethodArgument(Method m, int argument, boolean checkTrue) { - condtionCheckMethodGooglePreconditions(m, checkTrue) and argument = 0 - or - conditionCheckMethodApacheCommonsLang3Validate(m, checkTrue) and argument = 0 +private predicate methodCheckTrue(Method m, int arg) { + arg = 0 and + ( + m.hasQualifiedName("com.google.common.base", "Preconditions", ["checkArgument", "checkState"]) or + m.hasQualifiedName("com.google.common.base", "Verify", "verify") or + m.hasQualifiedName("org.apache.commons.lang3", "Validate", ["isTrue", "validState"]) or + m.hasQualifiedName("org.junit.jupiter.api", "Assertions", "assertTrue") or + m.hasQualifiedName("org.junit.jupiter.api", "Assumptions", "assumeTrue") or + m.hasQualifiedName("org.testng", "Assert", "assertTrue") + ) or - condtionCheckMethodTestingFramework(m, argument, checkTrue) + m.getParameter(arg).getType() instanceof BooleanType and + ( + m.hasQualifiedName("org.junit", "Assert", "assertTrue") or + m.hasQualifiedName("org.junit", "Assume", "assumeTrue") or + m.hasQualifiedName("junit.framework", _, "assertTrue") + ) +} + +/** + * Holds if `m` is a method that checks that its argument at position `arg` is + * equal to false and throws otherwise. + */ +private predicate methodCheckFalse(Method m, int arg) { + arg = 0 and + ( + m.hasQualifiedName("org.junit.jupiter.api", "Assertions", "assertFalse") or + m.hasQualifiedName("org.junit.jupiter.api", "Assumptions", "assumeFalse") or + m.hasQualifiedName("org.testng", "Assert", "assertFalse") + ) or - exists(Parameter p, MethodCall ma, int argIndex, boolean ct, Expr arg | - p = m.getParameter(argument) and - not m.isOverridable() and - m.getBody().getStmt(0).(ExprStmt).getExpr() = ma and - conditionCheckArgument(ma, argIndex, ct) and - ma.getArgument(argIndex) = arg and - ( - arg.(LogNotExpr).getExpr().(VarAccess).getVariable() = p and - checkTrue = ct.booleanNot() - or - arg.(VarAccess).getVariable() = p and checkTrue = ct - ) + m.getParameter(arg).getType() instanceof BooleanType and + ( + m.hasQualifiedName("org.junit", "Assert", "assertFalse") or + m.hasQualifiedName("org.junit", "Assume", "assumeFalse") or + m.hasQualifiedName("junit.framework", _, "assertFalse") + ) +} + +/** + * Holds if `m` is a method that checks that its argument at position `arg` is + * not null and throws otherwise. + */ +private predicate methodCheckNotNull(Method m, int arg) { + arg = 0 and + ( + m.hasQualifiedName("com.google.common.base", "Preconditions", "checkNotNull") or + m.hasQualifiedName("com.google.common.base", "Verify", "verifyNotNull") or + m.hasQualifiedName("org.apache.commons.lang3", "Validate", "notNull") or + m.hasQualifiedName("java.util", "Objects", "requireNonNull") or + m.hasQualifiedName("org.junit.jupiter.api", "Assertions", "assertNotNull") or + m.hasQualifiedName("org.junit", "Assume", "assumeNotNull") or // vararg + m.hasQualifiedName("org.testng", "Assert", "assertNotNull") ) or - exists(Parameter p, IfStmt ifstmt, Expr cond | - p = m.getParameter(argument) and - not m.isOverridable() and - p.getType() instanceof BooleanType and - m.getBody().getStmt(0) = ifstmt and - ifstmt.getCondition() = cond and - ( - cond.(LogNotExpr).getExpr().(VarAccess).getVariable() = p and checkTrue = true - or - cond.(VarAccess).getVariable() = p and checkTrue = false - ) and - ( - ifstmt.getThen() instanceof ThrowStmt or - ifstmt.getThen().(SingletonBlock).getStmt() instanceof ThrowStmt - ) + arg = m.getNumberOfParameters() - 1 and + ( + m.hasQualifiedName("org.junit", "Assert", "assertNotNull") or + m.hasQualifiedName("junit.framework", _, "assertNotNull") ) } -private predicate condtionCheckMethodGooglePreconditions(Method m, boolean checkTrue) { - m.getDeclaringType().hasQualifiedName("com.google.common.base", "Preconditions") and - checkTrue = true and - (m.hasName("checkArgument") or m.hasName("checkState")) +/** + * Holds if `m` is a method that checks that its argument at position `arg` + * satisfies a property specified by another argument and throws otherwise. + */ +private predicate methodCheckThat(Method m, int arg) { + m.getParameter(arg).getType().getErasure() instanceof TypeObject and + ( + m.hasQualifiedName("org.hamcrest", "MatcherAssert", "assertThat") or + m.hasQualifiedName("org.junit", "Assert", "assertThat") or + m.hasQualifiedName("org.junit", "Assume", "assumeThat") + ) } -private predicate conditionCheckMethodApacheCommonsLang3Validate(Method m, boolean checkTrue) { - m.getDeclaringType().hasQualifiedName("org.apache.commons.lang3", "Validate") and - checkTrue = true and - (m.hasName("isTrue") or m.hasName("validState")) +/** Holds if `m` is a method that unconditionally throws. */ +private predicate methodUnconditionallyThrows(Method m) { + m.hasQualifiedName("org.junit.jupiter.api", "Assertions", "fail") or + m.hasQualifiedName("org.junit", "Assert", "fail") or + m.hasQualifiedName("junit.framework", _, "fail") or + m.hasQualifiedName("org.testng", "Assert", "fail") } /** - * Holds if `m` is a non-overridable testing framework method that checks that its first argument - * is equal to `checkTrue` and throws otherwise. + * Holds if `mc` is a call to a method that checks that its argument `arg` is + * equal to `checkTrue` and throws otherwise. */ -private predicate condtionCheckMethodTestingFramework(Method m, int argument, boolean checkTrue) { - argument = 0 and - ( - m.getDeclaringType().hasQualifiedName("org.junit", "Assume") and - checkTrue = true and - m.hasName("assumeTrue") +predicate methodCallChecksBoolean(MethodCall mc, Expr arg, boolean checkTrue) { + exists(int pos | mc.getArgument(pos) = arg | + methodCheckTrue(mc.getMethod().getSourceDeclaration(), pos) and checkTrue = true or - m.getDeclaringType().hasQualifiedName("org.junit.jupiter.api", "Assertions") and - ( - checkTrue = true and m.hasName("assertTrue") - or - checkTrue = false and m.hasName("assertFalse") - ) - or - m.getDeclaringType().hasQualifiedName("org.junit.jupiter.api", "Assumptions") and - ( - checkTrue = true and m.hasName("assumeTrue") - or - checkTrue = false and m.hasName("assumeFalse") - ) + methodCheckFalse(mc.getMethod().getSourceDeclaration(), pos) and checkTrue = false ) - or - m.getDeclaringType().hasQualifiedName(["org.junit", "org.testng"], "Assert") and - m.getParameter(argument).getType() instanceof BooleanType and - ( - checkTrue = true and m.hasName("assertTrue") +} + +/** + * Holds if `mc` is a call to a method that checks that its argument `arg` is + * not null and throws otherwise. + */ +predicate methodCallChecksNotNull(MethodCall mc, Expr arg) { + exists(int pos | mc.getArgument(pos) = arg | + methodCheckNotNull(mc.getMethod().getSourceDeclaration(), pos) or - checkTrue = false and m.hasName("assertFalse") + methodCheckThat(mc.getMethod().getSourceDeclaration(), pos) and + mc.getAnArgument().(MethodCall).getMethod().getName() = "notNullValue" ) } /** + * Holds if `mc` is a call to a method that checks one of its arguments in some + * way and possibly throws. + */ +predicate methodCallChecksArgument(MethodCall mc) { + methodCallChecksBoolean(mc, _, _) or + methodCallChecksNotNull(mc, _) +} + +/** Holds if `mc` is a call to a method that unconditionally throws. */ +predicate methodCallUnconditionallyThrows(MethodCall mc) { + methodUnconditionallyThrows(mc.getMethod().getSourceDeclaration()) or + exists(BooleanLiteral b | methodCallChecksBoolean(mc, b, b.getBooleanValue().booleanNot())) +} + +/** + * DEPRECATED: Use `methodCallChecksBoolean` instead. + * + * Holds if `m` is a non-overridable method that checks that its zero-indexed `argument` + * is equal to `checkTrue` and throws otherwise. + */ +deprecated predicate conditionCheckMethodArgument(Method m, int argument, boolean checkTrue) { + methodCheckTrue(m, argument) and checkTrue = true + or + methodCheckFalse(m, argument) and checkTrue = false +} + +/** + * DEPRECATED: Use `methodCallChecksBoolean` instead. + * * Holds if `ma` is an access to a non-overridable method that checks that its * zero-indexed `argument` is equal to `checkTrue` and throws otherwise. */ -predicate conditionCheckArgument(MethodCall ma, int argument, boolean checkTrue) { +deprecated predicate conditionCheckArgument(MethodCall ma, int argument, boolean checkTrue) { conditionCheckMethodArgument(ma.getMethod().getSourceDeclaration(), argument, checkTrue) } diff --git a/java/ql/lib/semmle/code/java/dataflow/IntegerGuards.qll b/java/ql/lib/semmle/code/java/dataflow/IntegerGuards.qll index 042fd5194f23..ea2bce01e151 100644 --- a/java/ql/lib/semmle/code/java/dataflow/IntegerGuards.qll +++ b/java/ql/lib/semmle/code/java/dataflow/IntegerGuards.qll @@ -10,7 +10,7 @@ private import RangeUtils private import RangeAnalysis /** Gets an expression that might have the value `i`. */ -private Expr exprWithIntValue(int i) { +deprecated private Expr exprWithIntValue(int i) { result.(ConstantIntegerExpr).getIntValue() = i or result.(ChooseExpr).getAResultExpr() = exprWithIntValue(i) } @@ -19,11 +19,11 @@ private Expr exprWithIntValue(int i) { * An expression for which the predicate `integerGuard` is relevant. * This includes `VarRead` and `MethodCall`. */ -class IntComparableExpr extends Expr { +deprecated class IntComparableExpr extends Expr { IntComparableExpr() { this instanceof VarRead or this instanceof MethodCall } /** Gets an integer that is directly assigned to the expression in case of a variable; or zero. */ - int relevantInt() { + deprecated int relevantInt() { exists(SsaExplicitUpdate ssa, SsaSourceVariable v | this = v.getAnAccess() and ssa.getSourceVariable() = v and @@ -55,6 +55,9 @@ private predicate comparison(ComparisonExpr comp, boolean branch, Expr e1, Expr * Holds if `guard` evaluating to `branch` ensures that: * `e <= k` when `upper = true` * `e >= k` when `upper = false` + * + * Does _not_ include the constant comparison case where the guard directly + * ensures `e == k`. */ pragma[nomagic] predicate rangeGuard(Expr guard, boolean branch, Expr e, int k, boolean upper) { @@ -62,7 +65,8 @@ predicate rangeGuard(Expr guard, boolean branch, Expr e, int k, boolean upper) { eqtest = guard and eqtest.hasOperands(e, c) and bounded(c, any(ZeroBound zb), k, upper, _) and - branch = eqtest.polarity() + branch = eqtest.polarity() and + not c instanceof ConstantIntegerExpr ) or exists(Expr c, int val, boolean strict, int d | @@ -87,6 +91,30 @@ predicate rangeGuard(Expr guard, boolean branch, Expr e, int k, boolean upper) { } /** + * Gets an expression that directly tests whether a given expression, `e`, is + * non-zero. + */ +Expr nonZeroGuard(Expr e, boolean branch) { + exists(EqualityTest eqtest, boolean polarity, int k | + eqtest = result and + eqtest.hasOperands(e, any(ConstantIntegerExpr c | c.getIntValue() = k)) and + polarity = eqtest.polarity() + | + k = 0 and branch = polarity.booleanNot() + or + k != 0 and branch = polarity + ) + or + exists(int val, boolean upper | rangeGuard(result, branch, e, val, upper) | + upper = true and val < 0 // e <= val < 0 ==> e != 0 + or + upper = false and val > 0 // e >= val > 0 ==> e != 0 + ) +} + +/** + * DEPRECATED. + * * An expression that directly tests whether a given expression is equal to `k` or not. * The set of `k`s is restricted to those that are relevant for the expression or * have a direct comparison with the expression. @@ -95,7 +123,7 @@ predicate rangeGuard(Expr guard, boolean branch, Expr e, int k, boolean upper) { * is true, and different from `k` if `is_k` is false. */ pragma[nomagic] -Expr integerGuard(IntComparableExpr e, boolean branch, int k, boolean is_k) { +deprecated Expr integerGuard(IntComparableExpr e, boolean branch, int k, boolean is_k) { exists(EqualityTest eqtest, boolean polarity | eqtest = result and eqtest.hasOperands(e, any(ConstantIntegerExpr c | c.getIntValue() = k)) and @@ -119,13 +147,15 @@ Expr integerGuard(IntComparableExpr e, boolean branch, int k, boolean is_k) { } /** + * DEPRECATED: Use `rangeGuard` instead. + * * A guard that splits the values of a variable into one range with an upper bound of `k-1` * and one with a lower bound of `k`. * * If `branch_with_lower_bound_k` is true then `result` is equivalent to `k <= x` * and if it is false then `result` is equivalent to `k > x`. */ -Expr intBoundGuard(VarRead x, boolean branch_with_lower_bound_k, int k) { +deprecated Expr intBoundGuard(VarRead x, boolean branch_with_lower_bound_k, int k) { exists(ComparisonExpr comp, ConstantIntegerExpr c, int val | comp = result and comp.hasOperands(x, c) and diff --git a/java/ql/lib/semmle/code/java/dataflow/Nullness.qll b/java/ql/lib/semmle/code/java/dataflow/Nullness.qll index 756c5d1ae9f7..8728af2c0db2 100644 --- a/java/ql/lib/semmle/code/java/dataflow/Nullness.qll +++ b/java/ql/lib/semmle/code/java/dataflow/Nullness.qll @@ -9,49 +9,31 @@ overlay[local?] module; -/* - * Implementation details: - * - * The three exported predicates, `nullDeref`, `alwaysNullDeref`, and - * `superfluousNullGuard`, compute potential null dereferences, definite null - * dereferences, and superfluous null checks, respectively. The bulk of the - * library supports `nullDeref`, while the latter two are fairly simple in - * comparison. - * - * The NPE (NullPointerException) candidates are computed by - * `nullDerefCandidate` and consist of three parts: A variable definition that - * might be null as computed by `varMaybeNull`, a dereference that can cause a - * NPE as computed by `firstVarDereferenceInBlock`, and a control flow path - * between the two points. The path is computed by `varMaybeNullInBlock`, - * which is the transitive closure of the step relation `nullVarStep` - * originating in a definition given by `varMaybeNull`. The step relation - * `nullVarStep` is essentially just the successor relation on basic blocks - * restricted to exclude edges along which the variable cannot be null. - * - * The step relation `nullVarStep` is then reused twice to produce two - * refinements of the path reachability predicate `varMaybeNullInBlock` in - * order to prune impossible paths that would otherwise lead to a potential - * NPE. These two refinements are `varMaybeNullInBlock_corrCond` and - * `varMaybeNullInBlock_trackVar` and are described in further detail below. - */ - import java private import SSA private import semmle.code.java.controlflow.Guards -private import RangeUtils private import IntegerGuards private import NullGuards private import semmle.code.java.Collections -private import semmle.code.java.frameworks.Assertions +private import semmle.code.java.controlflow.internal.Preconditions +private import semmle.code.java.controlflow.ControlFlow as Cf + +/** Gets an expression that may be `null`. */ +Expr nullExpr() { result = nullExpr(_) } /** Gets an expression that may be `null`. */ -Expr nullExpr() { - result instanceof NullLiteral or - result.(ChooseExpr).getAResultExpr() = nullExpr() or - result.(AssignExpr).getSource() = nullExpr() or - result.(CastExpr).getExpr() = nullExpr() or - result.(ImplicitCastExpr).getExpr() = nullExpr() or - result instanceof SafeCastExpr +private Expr nullExpr(Expr reason) { + result instanceof NullLiteral and reason = result + or + result.(ChooseExpr).getAResultExpr() = nullExpr(reason) + or + result.(AssignExpr).getSource() = nullExpr(reason) + or + result.(CastExpr).getExpr() = nullExpr(reason) + or + result.(ImplicitCastExpr).getExpr() = nullExpr(reason) + or + result instanceof SafeCastExpr and reason = result } /** An expression of a boxed type that is implicitly unboxed. */ @@ -137,58 +119,29 @@ private ControlFlowNode varDereference(SsaVariable v, VarAccess va) { } /** - * A `ControlFlowNode` that ensures that the SSA variable is not null in any - * subsequent use, either by dereferencing it or by an assertion. - */ -private ControlFlowNode ensureNotNull(SsaVariable v) { - result = varDereference(v, _) - or - exists(AssertTrueMethod m | result.asCall() = m.getACheck(directNullGuard(v, true, false))) - or - exists(AssertFalseMethod m | result.asCall() = m.getACheck(directNullGuard(v, false, false))) - or - exists(AssertNotNullMethod m | result.asCall() = m.getACheck(v.getAUse())) - or - exists(AssertThatMethod m, MethodCall ma | - result.asCall() = m.getACheck(v.getAUse()) and ma.getControlFlowNode() = result - | - ma.getAnArgument().(MethodCall).getMethod().getName() = "notNullValue" - ) -} - -/** - * A variable dereference that cannot be reached by a `null` value, because of an earlier - * dereference or assertion in the same `BasicBlock`. - */ -private predicate unreachableVarDereference(BasicBlock bb, SsaVariable v, ControlFlowNode varDeref) { - exists(ControlFlowNode n, int i, int j | - (n = ensureNotNull(v) or assertFail(bb, n)) and - varDeref = varDereference(v, _) and - bb.getNode(i) = n and - bb.getNode(j) = varDeref and - i < j - ) -} - -/** - * The first dereference of a variable in a given `BasicBlock` excluding those dereferences - * that are preceded by a not-null assertion or a trivially failing assertion. + * The first dereference of a variable in a given `BasicBlock`. */ private predicate firstVarDereferenceInBlock(BasicBlock bb, SsaVariable v, VarAccess va) { exists(ControlFlowNode n | varDereference(v, va) = n and n.getBasicBlock() = bb and - not unreachableVarDereference(bb, v, n) + n = + min(ControlFlowNode n0, int i | + varDereference(v, _) = n0 and bb.getNode(i) = n0 + | + n0 order by i + ) ) } /** A variable suspected of being `null`. */ -private predicate varMaybeNull(SsaVariable v, string msg, Expr reason) { +private predicate varMaybeNull(SsaVariable v, ControlFlowNode node, string msg, Expr reason) { // A variable compared to null might be null. exists(Expr e | reason = e and msg = "as suggested by $@ null guard" and guardSuggestsVarMaybeNull(e, v) and + node = v.getCfgNode() and not v instanceof SsaPhiNode and not clearlyNotNull(v) and // Comparisons in finally blocks are excluded since missing exception edges in the CFG could otherwise yield FPs. @@ -204,6 +157,7 @@ private predicate varMaybeNull(SsaVariable v, string msg, Expr reason) { // A parameter might be null if there is a null argument somewhere. exists(Parameter p, Expr arg | v.(SsaImplicitInit).isParameterDefinition(p) and + node = v.getCfgNode() and p.getAnArgument() = arg and reason = arg and msg = "because of $@ null argument" and @@ -214,7 +168,7 @@ private predicate varMaybeNull(SsaVariable v, string msg, Expr reason) { // If the source of a variable is null then the variable may be null. exists(VariableAssign def | v.(SsaExplicitUpdate).getDefiningExpr() = def and - def.getSource() = nullExpr() and + def.getSource() = nullExpr(node.asExpr()) and reason = def and msg = "because of $@ assignment" ) @@ -236,7 +190,7 @@ private Expr nonEmptyExpr() { // ...or it is guarded by a condition proving its length to be non-zero. exists(ConditionBlock cond, boolean branch, FieldAccess length | cond.controls(result.getBasicBlock(), branch) and - cond.getCondition() = integerGuard(length, branch, 0, false) and + cond.getCondition() = nonZeroGuard(length, branch) and length.getField().hasName("length") and length.getQualifier() = v.getAUse() ) @@ -266,7 +220,7 @@ private Expr nonEmptyExpr() { or // ...or a check on its `size`. exists(MethodCall size | - c = integerGuard(size, branch, 0, false) and + c = nonZeroGuard(size, branch) and size.getMethod().hasName("size") and size.getQualifier() = v.getAUse() ) @@ -294,536 +248,29 @@ private predicate impossibleEdge(BasicBlock bb1, BasicBlock bb2) { ) } -/** A control flow edge that leaves a finally-block. */ -private predicate leavingFinally(BasicBlock bb1, BasicBlock bb2, boolean normaledge) { - exists(TryStmt try, BlockStmt finally | - try.getFinally() = finally and - bb1.getASuccessor() = bb2 and - bb1.getFirstNode().getEnclosingStmt().getEnclosingStmt*() = finally and - not bb2.getFirstNode().getEnclosingStmt().getEnclosingStmt*() = finally and - if bb1.getLastNode().getANormalSuccessor() = bb2.getFirstNode() - then normaledge = true - else normaledge = false - ) -} - -private predicate ssaSourceVarMaybeNull(SsaSourceVariable v) { - varMaybeNull(v.getAnSsaVariable(), _, _) -} - -/** - * The step relation for propagating that a given SSA variable might be `null` in a given `BasicBlock`. - * - * If `midssa` is null in `mid` then `ssa` might be null in `bb`. The SSA variables share the same - * `SsaSourceVariable`. - * - * A boolean flag tracks whether a non-normal completion is waiting to resume upon the exit of a finally-block. - * If the flag is set, then the normal edge out of the finally-block is prohibited, but if it is not set then - * no knowledge is assumed of any potentially waiting completions. `midstoredcompletion` is the flag before - * the step and `storedcompletion` is the flag after the step. - */ -private predicate nullVarStep( - SsaVariable midssa, BasicBlock mid, boolean midstoredcompletion, SsaVariable ssa, BasicBlock bb, - boolean storedcompletion -) { - exists(SsaSourceVariable v | - ssaSourceVarMaybeNull(v) and - midssa.getSourceVariable() = v - | - ssa.(SsaPhiNode).getAPhiInput() = midssa and ssa.getBasicBlock() = bb - or - ssa = midssa and - not exists(SsaPhiNode phi | phi.getSourceVariable() = v and phi.getBasicBlock() = bb) - ) and - (midstoredcompletion = true or midstoredcompletion = false) and - midssa.isLiveAtEndOfBlock(mid) and - not ensureNotNull(midssa).getBasicBlock() = mid and - not assertFail(mid, _) and - bb = mid.getASuccessor() and - not impossibleEdge(mid, bb) and - not nullGuardControlsBranchEdge(midssa, false, mid, bb) and - not (leavingFinally(mid, bb, true) and midstoredcompletion = true) and - if bb.getFirstNode().asStmt() = any(TryStmt try | | try.getFinally()) - then - if bb.getFirstNode() = mid.getLastNode().getANormalSuccessor() - then storedcompletion = false - else storedcompletion = true - else - if leavingFinally(mid, bb, _) - then storedcompletion = false - else storedcompletion = midstoredcompletion -} +private module NullnessConfig implements Cf::ControlFlow::ConfigSig { + predicate source(ControlFlowNode node, SsaVariable def) { varMaybeNull(def, node, _, _) } -/** - * The transitive closure of `nullVarStep` originating from `varMaybeNull`. That is, those `BasicBlock`s - * for which the SSA variable is suspected of being `null`. - */ -private predicate varMaybeNullInBlock( - SsaVariable ssa, SsaSourceVariable v, BasicBlock bb, boolean storedcompletion -) { - varMaybeNull(ssa, _, _) and - bb = ssa.getBasicBlock() and - storedcompletion = false and - v = ssa.getSourceVariable() - or - exists(BasicBlock mid, SsaVariable midssa, boolean midstoredcompletion | - varMaybeNullInBlock(midssa, v, mid, midstoredcompletion) and - nullVarStep(midssa, mid, midstoredcompletion, ssa, bb, storedcompletion) - ) -} + predicate sink(ControlFlowNode node, SsaVariable def) { varDereference(def, _) = node } -/** - * Holds if `v` is a source variable that might reach a potential `null` - * dereference. - */ -private predicate nullDerefCandidateVariable(SsaSourceVariable v) { - exists(SsaVariable ssa, BasicBlock bb | - firstVarDereferenceInBlock(bb, ssa, _) and - varMaybeNullInBlock(ssa, v, bb, _) - ) -} + predicate barrierValue(GuardValue gv) { gv.isNullness(false) } -private predicate varMaybeNullInBlock_origin( - SsaVariable origin, SsaVariable ssa, BasicBlock bb, boolean storedcompletion -) { - nullDerefCandidateVariable(ssa.getSourceVariable()) and - varMaybeNull(ssa, _, _) and - bb = ssa.getBasicBlock() and - storedcompletion = false and - origin = ssa - or - exists(BasicBlock mid, SsaVariable midssa, boolean midstoredcompletion | - varMaybeNullInBlock_origin(origin, midssa, mid, midstoredcompletion) and - nullVarStep(midssa, mid, midstoredcompletion, ssa, bb, storedcompletion) - ) -} + predicate barrierEdge(BasicBlock bb1, BasicBlock bb2) { impossibleEdge(bb1, bb2) } -/** - * A potential `null` dereference. That is, the first dereference of a variable in a block - * where it is suspected of being `null`. - */ -private predicate nullDerefCandidate(SsaVariable origin, VarAccess va) { - exists(SsaVariable ssa, BasicBlock bb | - firstVarDereferenceInBlock(bb, ssa, va) and - varMaybeNullInBlock_origin(origin, ssa, bb, _) - ) + predicate uncertainFlow() { none() } } -/* - * In the following, the potential `null` dereference candidates are pruned by proving that - * a `NullPointerException` (NPE) cannot occur. This is done by pruning the control-flow paths - * that lead to the NPE candidate in two ways: - * - * 1. For each set of correlated conditions that are passed by the path, consistent - * branches must be taken. For example, the following code is safe due to the two tests on - * `flag` begin correlated. - * ``` - * x = null; - * if (flag) x = new A(); - * if (flag) x.m(); - * ``` - * - * 2. For each other variable that changes its value alongside the potential NPE candidate, - * the passed conditions must be consistent with its value. For example, the following - * code is safe due to the value of `t`. - * ``` - * x = null; - * t = null; - * if (...) { x = new A(); t = new B(); } - * if (t != null) x.m(); - * ``` - * We call such a variable a _tracking variable_ as it tracks the null-ness of `x`. - */ - -/** A variable that is assigned `null` if the given condition takes the given branch. */ -private predicate varConditionallyNull(SsaExplicitUpdate v, ConditionBlock cond, boolean branch) { - exists(ConditionalExpr condexpr | - v.getDefiningExpr().(VariableAssign).getSource() = condexpr and - condexpr.getCondition() = cond.getCondition() - | - condexpr.getBranchExpr(branch) = nullExpr() and - not condexpr.getBranchExpr(branch.booleanNot()) = nullExpr() - ) - or - v.getDefiningExpr().(VariableAssign).getSource() = nullExpr() and - cond.controls(v.getBasicBlock(), branch) -} +private module NullnessFlow = Cf::ControlFlow::Flow; /** - * A condition that might be useful in proving an NPE candidate safe. - * - * This is a condition along the path that found the NPE candidate. - */ -private predicate interestingCond(SsaSourceVariable npecand, ConditionBlock cond) { - nullDerefCandidateVariable(npecand) and - ( - varMaybeNullInBlock(_, npecand, cond, _) or - varConditionallyNull(npecand.getAnSsaVariable(), cond, _) - ) and - not cond.getCondition().(Expr).getAChildExpr*() = npecand.getAnAccess() -} - -pragma[nomagic] -private ConditionBlock ssaIntegerGuard(SsaVariable v, boolean branch, int k, boolean is_k) { - result.getCondition() = integerGuard(v.getAUse(), branch, k, is_k) -} - -pragma[nomagic] -private ConditionBlock ssaIntBoundGuard(SsaVariable v, boolean branch_with_lower_bound_k, int k) { - result.getCondition() = intBoundGuard(v.getAUse(), branch_with_lower_bound_k, k) -} - -pragma[nomagic] -private ConditionBlock ssaEnumConstEquality(SsaVariable v, boolean polarity, EnumConstant c) { - result.getCondition() = enumConstEquality(v.getAUse(), polarity, c) -} - -private predicate conditionChecksNull(ConditionBlock cond, SsaVariable v, boolean branchIsNull) { - nullGuardControlsBranchEdge(v, true, cond, cond.getTestSuccessor(branchIsNull)) and - nullGuardControlsBranchEdge(v, false, cond, cond.getTestSuccessor(branchIsNull.booleanNot())) -} - -/** A pair of correlated conditions for a given NPE candidate. */ -private predicate correlatedConditions( - SsaSourceVariable npecand, ConditionBlock cond1, ConditionBlock cond2, boolean inverted -) { - interestingCond(npecand, cond1) and - interestingCond(npecand, cond2) and - cond1 != cond2 and - ( - exists(SsaVariable v | - cond1.getCondition() = v.getAUse() and - cond2.getCondition() = v.getAUse() and - inverted = false - ) - or - exists(SsaVariable v, boolean branch1, boolean branch2 | - conditionChecksNull(cond1, v, branch1) and - conditionChecksNull(cond2, v, branch2) and - inverted = branch1.booleanXor(branch2) - ) - or - exists(SsaVariable v, int k, boolean branch1, boolean branch2 | - cond1 = ssaIntegerGuard(v, branch1, k, true) and - cond1 = ssaIntegerGuard(v, branch1.booleanNot(), k, false) and - cond2 = ssaIntegerGuard(v, branch2, k, true) and - cond2 = ssaIntegerGuard(v, branch2.booleanNot(), k, false) and - inverted = branch1.booleanXor(branch2) - ) - or - exists(SsaVariable v, int k, boolean branch1, boolean branch2 | - cond1 = ssaIntBoundGuard(v, branch1, k) and - cond2 = ssaIntBoundGuard(v, branch2, k) and - inverted = branch1.booleanXor(branch2) - ) - or - exists(SsaVariable v, EnumConstant c, boolean pol1, boolean pol2 | - cond1 = ssaEnumConstEquality(v, pol1, c) and - cond2 = ssaEnumConstEquality(v, pol2, c) and - inverted = pol1.booleanXor(pol2) - ) - or - exists(SsaVariable v, RefType type | - cond1.getCondition() = instanceofExpr(v, type) and - cond2.getCondition() = instanceofExpr(v, type) and - inverted = false - ) - or - exists(SsaVariable v1, SsaVariable v2, boolean branch1, boolean branch2 | - cond1.getCondition() = varEqualityTestExpr(v1, v2, branch1) and - cond2.getCondition() = varEqualityTestExpr(v1, v2, branch2) and - inverted = branch1.booleanXor(branch2) - ) - ) -} - -/** - * This is again the transitive closure of `nullVarStep` similarly to `varMaybeNullInBlock`, but - * this time restricted based on pairs of correlated conditions consistent with `cond1` - * evaluating to `branch`. - */ -private predicate varMaybeNullInBlock_corrCond( - SsaVariable origin, SsaVariable ssa, BasicBlock bb, boolean storedcompletion, - ConditionBlock cond1, boolean branch -) { - exists(SsaSourceVariable npecand | npecand = ssa.getSourceVariable() | - nullDerefCandidateVariable(npecand) and correlatedConditions(npecand, cond1, _, _) - ) and - ( - varConditionallyNull(ssa, cond1, branch) - or - not varConditionallyNull(ssa, cond1, _) and - (branch = true or branch = false) - ) and - varMaybeNull(ssa, _, _) and - bb = ssa.getBasicBlock() and - storedcompletion = false and - origin = ssa - or - exists(BasicBlock mid, SsaVariable midssa, boolean midstoredcompletion | - varMaybeNullInBlock_corrCond(origin, midssa, mid, midstoredcompletion, cond1, branch) and - ( - cond1 = mid and cond1.getTestSuccessor(branch) = bb - or - exists(ConditionBlock cond2, boolean inverted, boolean branch2 | - cond2 = mid and - correlatedConditions(_, cond1, cond2, inverted) and - cond2.getTestSuccessor(branch2) = bb and - branch = branch2.booleanXor(inverted) - ) - or - cond1 != mid and - not exists(ConditionBlock cond2 | cond2 = mid and correlatedConditions(_, cond1, cond2, _)) - ) and - nullVarStep(midssa, mid, midstoredcompletion, ssa, bb, storedcompletion) - ) -} - -/* - * A tracking variable has its possible values divided into two sets, A and B, for - * which we can attribute at least one direct assignment to be contained in either - * A or B. - * Four kinds are supported: - * - null: A means null and B means non-null. - * - boolean: A means true and B means false. - * - enum: A means a specific enum constant and B means any other value. - * - int: A means a specific integer value and B means any other value. - */ - -private newtype TrackVarKind = - TrackVarKindNull() or - TrackVarKindBool() or - TrackVarKindEnum() or - TrackVarKindInt() - -/** A variable that might be relevant as a tracking variable for the NPE candidate. */ -private predicate trackingVar( - SsaSourceVariable npecand, SsaExplicitUpdate trackssa, SsaSourceVariable trackvar, - TrackVarKind kind, Expr init -) { - exists(ConditionBlock cond | - interestingCond(npecand, cond) and - varMaybeNullInBlock(_, npecand, cond, _) and - cond.getCondition().(Expr).getAChildExpr*() = trackvar.getAnAccess() and - trackssa.getSourceVariable() = trackvar and - trackssa.getDefiningExpr().(VariableAssign).getSource() = init - | - init instanceof NullLiteral and kind = TrackVarKindNull() - or - init = clearlyNotNullExpr() and kind = TrackVarKindNull() - or - init instanceof BooleanLiteral and kind = TrackVarKindBool() - or - init.(VarAccess).getVariable() instanceof EnumConstant and kind = TrackVarKindEnum() - or - exists(init.(ConstantIntegerExpr).getIntValue()) and kind = TrackVarKindInt() - ) -} - -/** Gets an expression that tests the value of a given tracking variable. */ -private Expr trackingVarGuard( - SsaVariable trackssa, SsaSourceVariable trackvar, TrackVarKind kind, boolean branch, boolean isA -) { - exists(Expr init | trackingVar(_, trackssa, trackvar, kind, init) | - result = basicNullGuard(trackvar.getAnAccess(), branch, isA) and - kind = TrackVarKindNull() - or - result = trackvar.getAnAccess() and - kind = TrackVarKindBool() and - (branch = true or branch = false) and - isA = branch - or - exists(boolean polarity, EnumConstant c, EnumConstant initc | - initc.getAnAccess() = init and - kind = TrackVarKindEnum() and - result = enumConstEquality(trackvar.getAnAccess(), polarity, c) and - ( - initc = c and branch = polarity.booleanNot() and isA = false - or - initc = c and branch = polarity and isA = true - or - initc != c and branch = polarity and isA = false - ) - ) - or - exists(int k | - init.(ConstantIntegerExpr).getIntValue() = k and - kind = TrackVarKindInt() - | - result = integerGuard(trackvar.getAnAccess(), branch, k, isA) - or - exists(int k2 | - result = integerGuard(trackvar.getAnAccess(), branch, k2, true) and - isA = false and - k2 != k - ) - or - exists(int bound, boolean branch_with_lower_bound | - result = intBoundGuard(trackvar.getAnAccess(), branch_with_lower_bound, bound) and - isA = false - | - branch = branch_with_lower_bound and k < bound - or - branch = branch_with_lower_bound.booleanNot() and bound <= k - ) - ) - ) - or - exists(EqualityTest eqtest, boolean branch0, boolean polarity, BooleanLiteral boollit | - eqtest = result and - eqtest.hasOperands(trackingVarGuard(trackssa, trackvar, kind, branch0, isA), boollit) and - eqtest.polarity() = polarity and - branch = branch0.booleanXor(polarity).booleanXor(boollit.getBooleanValue()) - ) -} - -/** An update to a tracking variable that is contained fully in either A or B. */ -private predicate isReset( - SsaVariable trackssa, SsaSourceVariable trackvar, TrackVarKind kind, SsaExplicitUpdate update, - boolean isA -) { - exists(Expr init, Expr e | - trackingVar(_, trackssa, trackvar, kind, init) and - update.getSourceVariable() = trackvar and - e = update.getDefiningExpr().(VariableAssign).getSource() - | - e instanceof NullLiteral and kind = TrackVarKindNull() and isA = true - or - e = clearlyNotNullExpr() and kind = TrackVarKindNull() and isA = false - or - e.(BooleanLiteral).getBooleanValue() = isA and kind = TrackVarKindBool() - or - e.(VarAccess).getVariable().(EnumConstant) = init.(VarAccess).getVariable() and - kind = TrackVarKindEnum() and - isA = true - or - e.(VarAccess).getVariable().(EnumConstant) != init.(VarAccess).getVariable() and - kind = TrackVarKindEnum() and - isA = false - or - e.(ConstantIntegerExpr).getIntValue() = init.(ConstantIntegerExpr).getIntValue() and - kind = TrackVarKindInt() and - isA = true - or - e.(ConstantIntegerExpr).getIntValue() != init.(ConstantIntegerExpr).getIntValue() and - kind = TrackVarKindInt() and - isA = false - ) -} - -/** The abstract value of the tracked variable. */ -private newtype TrackedValue = - TrackedValueA() or - TrackedValueB() or - TrackedValueUnknown() - -private TrackedValue trackValAorB(boolean isA) { - isA = true and result = TrackedValueA() - or - isA = false and result = TrackedValueB() -} - -/** A control flow edge passing through a condition that implies a specific value for a tracking variable. */ -private predicate stepImplies( - BasicBlock bb1, BasicBlock bb2, SsaVariable trackssa, SsaSourceVariable trackvar, - TrackVarKind kind, boolean isA -) { - exists(ConditionBlock cond, boolean branch | - cond = bb1 and - cond.getTestSuccessor(branch) = bb2 and - cond.getCondition() = trackingVarGuard(trackssa, trackvar, kind, branch, isA) - ) -} - -/** - * This is again the transitive closure of `nullVarStep` similarly to `varMaybeNullInBlock`, but - * this time restricted based on a tracking variable. - */ -private predicate varMaybeNullInBlock_trackVar( - SsaVariable origin, SsaVariable ssa, BasicBlock bb, boolean storedcompletion, - SsaVariable trackssa, SsaSourceVariable trackvar, TrackVarKind kind, TrackedValue trackvalue -) { - exists(SsaSourceVariable npecand | npecand = ssa.getSourceVariable() | - nullDerefCandidateVariable(npecand) and trackingVar(npecand, trackssa, trackvar, kind, _) - ) and - ( - exists(SsaVariable init, boolean isA | - init.getSourceVariable() = trackvar and - init.isLiveAtEndOfBlock(bb) and - isReset(trackssa, trackvar, kind, init, isA) and - trackvalue = trackValAorB(isA) - ) - or - trackvalue = TrackedValueUnknown() and - not exists(SsaVariable init | - init.getSourceVariable() = trackvar and - init.isLiveAtEndOfBlock(bb) and - isReset(trackssa, trackvar, kind, init, _) - ) - ) and - varMaybeNull(ssa, _, _) and - bb = ssa.getBasicBlock() and - storedcompletion = false and - origin = ssa - or - exists(BasicBlock mid, SsaVariable midssa, boolean midstoredcompletion, TrackedValue trackvalue0 | - varMaybeNullInBlock_trackVar(origin, midssa, mid, midstoredcompletion, trackssa, trackvar, kind, - trackvalue0) and - nullVarStep(midssa, mid, midstoredcompletion, ssa, bb, storedcompletion) and - ( - trackvalue0 = TrackedValueUnknown() - or - // A step that implies a value that contradicts the current value is not allowed. - exists(boolean isA | trackvalue0 = trackValAorB(isA) | - not stepImplies(mid, bb, trackssa, trackvar, kind, isA.booleanNot()) - ) - ) and - ( - // If no update occurs then the tracked value is unchanged unless the step implies a given value via a condition. - not exists(SsaUpdate update | - update.getSourceVariable() = trackvar and - update.getBasicBlock() = bb - ) and - ( - exists(boolean isA | stepImplies(mid, bb, trackssa, trackvar, kind, isA) | - trackvalue = trackValAorB(isA) - ) - or - not stepImplies(mid, bb, trackssa, trackvar, kind, _) and trackvalue = trackvalue0 - ) - or - // If an update occurs then the tracked value is set accordingly. - exists(SsaUpdate update | - update.getSourceVariable() = trackvar and - update.getBasicBlock() = bb - | - exists(boolean isA | isReset(trackssa, trackvar, kind, update, isA) | - trackvalue = trackValAorB(isA) - ) - or - not isReset(trackssa, trackvar, kind, update, _) and trackvalue = TrackedValueUnknown() - ) - ) - ) -} - -/** - * A potential `null` dereference that has not been proven safe. + * Holds if the dereference of `v` at `va` might be `null`. */ predicate nullDeref(SsaSourceVariable v, VarAccess va, string msg, Expr reason) { - exists(SsaVariable origin, SsaVariable ssa, BasicBlock bb | - nullDerefCandidate(origin, va) and - varMaybeNull(origin, msg, reason) and + exists(SsaVariable origin, SsaVariable ssa, ControlFlowNode src, ControlFlowNode sink | + varMaybeNull(origin, src, msg, reason) and + NullnessFlow::flow(src, origin, sink, ssa) and ssa.getSourceVariable() = v and - firstVarDereferenceInBlock(bb, ssa, va) and - forall(ConditionBlock cond | correlatedConditions(v, cond, _, _) | - varMaybeNullInBlock_corrCond(origin, ssa, bb, _, cond, _) - ) and - forall(SsaVariable guardssa, SsaSourceVariable guardvar, TrackVarKind kind | - trackingVar(v, guardssa, guardvar, kind, _) - | - varMaybeNullInBlock_trackVar(origin, ssa, bb, _, guardssa, guardvar, kind, _) - ) + varDereference(ssa, va) = sink ) } diff --git a/java/ql/lib/semmle/code/java/dataflow/SSA.qll b/java/ql/lib/semmle/code/java/dataflow/SSA.qll index dd902b70e35a..962f38e80ea6 100644 --- a/java/ql/lib/semmle/code/java/dataflow/SSA.qll +++ b/java/ql/lib/semmle/code/java/dataflow/SSA.qll @@ -253,17 +253,18 @@ class SsaImplicitUpdate extends SsaUpdate { or if this.hasImplicitQualifierUpdate() then - if exists(this.getANonLocalUpdate()) + if isNonLocal(this) then result = "nonlocal + nonlocal qualifier" else result = "nonlocal qualifier" else ( - exists(this.getANonLocalUpdate()) and result = "nonlocal" + isNonLocal(this) and result = "nonlocal" ) } /** * Gets a reachable `FieldWrite` that might represent this ssa update, if any. */ + overlay[global] FieldWrite getANonLocalUpdate() { exists(SsaSourceField f, Callable setter | relevantFieldUpdate(setter, f.getField(), result) and @@ -287,6 +288,11 @@ class SsaImplicitUpdate extends SsaUpdate { } } +overlay[global] +private predicate isNonLocalImpl(SsaImplicitUpdate su) { exists(su.getANonLocalUpdate()) } + +private predicate isNonLocal(SsaImplicitUpdate su) = forceLocal(isNonLocalImpl/1)(su) + /** * An SSA variable that represents an uncertain implicit update of the value. * This is a `Call` that might reach a non-local update of the field or one of diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll index dc2cb7e7d00d..275a0afafc08 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll @@ -157,15 +157,20 @@ private predicate hasEntryDef(TrackedVar v, BasicBlock b) { } /** Holds if `n` might update the locally tracked variable `v`. */ +overlay[global] pragma[nomagic] -private predicate uncertainVariableUpdate(TrackedVar v, ControlFlowNode n, BasicBlock b, int i) { +private predicate uncertainVariableUpdateImpl(TrackedVar v, ControlFlowNode n, BasicBlock b, int i) { exists(Call c | c = n.asCall() | updatesNamedField(c, v, _)) and b.getNode(i) = n and hasDominanceInformation(b) or - uncertainVariableUpdate(v.getQualifier(), n, b, i) + uncertainVariableUpdateImpl(v.getQualifier(), n, b, i) } +/** Holds if `n` might update the locally tracked variable `v`. */ +predicate uncertainVariableUpdate(TrackedVar v, ControlFlowNode n, BasicBlock b, int i) = + forceLocal(uncertainVariableUpdateImpl/4)(v, n, b, i) + private module SsaInput implements SsaImplCommon::InputSig { class SourceVariable = SsaSourceVariable; @@ -335,6 +340,7 @@ private module Cached { * Constructor --(intraInstanceCallEdge)-->+ Method(setter of this.f) * ``` */ + overlay[global] private predicate intraInstanceCallEdge(Callable c1, Method m2) { exists(MethodCall ma, RefType t1 | ma.getCaller() = c1 and @@ -355,6 +361,7 @@ private module Cached { ) } + overlay[global] private Callable tgt(Call c) { result = viableImpl_v2(c) or @@ -364,11 +371,13 @@ private module Cached { } /** Holds if `(c1,c2)` is an edge in the call graph. */ + overlay[global] private predicate callEdge(Callable c1, Callable c2) { exists(Call c | c.getCaller() = c1 and c2 = tgt(c)) } /** Holds if `(c1,c2)` is an edge in the call graph excluding `intraInstanceCallEdge`. */ + overlay[global] private predicate crossInstanceCallEdge(Callable c1, Callable c2) { callEdge(c1, c2) and not intraInstanceCallEdge(c1, c2) } @@ -382,6 +391,7 @@ private module Cached { relevantFieldUpdate(_, f.getField(), _) } + overlay[global] private predicate source(Call call, TrackedField f, Field field, Callable c, boolean fresh) { relevantCall(call, f) and field = f.getField() and @@ -395,9 +405,11 @@ private module Cached { * `fresh` indicates whether the instance `this` in `c` has been freshly * allocated along the call-chain. */ + overlay[global] private newtype TCallableNode = MkCallableNode(Callable c, boolean fresh) { source(_, _, _, c, fresh) or edge(_, c, fresh) } + overlay[global] private predicate edge(TCallableNode n, Callable c2, boolean f2) { exists(Callable c1, boolean f1 | n = MkCallableNode(c1, f1) | intraInstanceCallEdge(c1, c2) and f2 = f1 @@ -407,6 +419,7 @@ private module Cached { ) } + overlay[global] private predicate edge(TCallableNode n1, TCallableNode n2) { exists(Callable c2, boolean f2 | edge(n1, c2, f2) and @@ -414,6 +427,7 @@ private module Cached { ) } + overlay[global] pragma[noinline] private predicate source(Call call, TrackedField f, Field field, TCallableNode n) { exists(Callable c, boolean fresh | @@ -422,24 +436,28 @@ private module Cached { ) } + overlay[global] private predicate sink(Callable c, Field f, TCallableNode n) { setsOwnField(c, f) and n = MkCallableNode(c, false) or setsOtherField(c, f) and n = MkCallableNode(c, _) } + overlay[global] private predicate prunedNode(TCallableNode n) { sink(_, _, n) or exists(TCallableNode mid | edge(n, mid) and prunedNode(mid)) } + overlay[global] private predicate prunedEdge(TCallableNode n1, TCallableNode n2) { prunedNode(n1) and prunedNode(n2) and edge(n1, n2) } + overlay[global] private predicate edgePlus(TCallableNode c1, TCallableNode c2) = fastTC(prunedEdge/2)(c1, c2) /** @@ -447,6 +465,7 @@ private module Cached { * where `f` and `call` share the same enclosing callable in which a * `FieldRead` of `f` is reachable from `call`. */ + overlay[global] pragma[noopt] private predicate updatesNamedFieldImpl(Call call, TrackedField f, Callable setter) { exists(TCallableNode src, TCallableNode sink, Field field | @@ -457,11 +476,13 @@ private module Cached { } bindingset[call, f] + overlay[global] pragma[inline_late] private predicate updatesNamedField0(Call call, TrackedField f, Callable setter) { updatesNamedField(call, f, setter) } + overlay[global] cached predicate defUpdatesNamedField(SsaImplicitUpdate def, TrackedField f, Callable setter) { f = def.getSourceVariable() and diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll index 40e361ed1588..b5e7fd53c9fd 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/TaintTrackingUtil.qll @@ -278,21 +278,23 @@ private predicate inputStreamWrapper(Constructor c, int argi) { /** An object construction that preserves the data flow status of any of its arguments. */ private predicate constructorStep(Expr tracked, ConstructorCall sink, string model) { - exists(int argi | sink.getArgument(argi) = tracked | + exists(int argi | sink.getArgument(pragma[only_bind_into](argi)) = tracked | // wrappers constructed by extension exists(Constructor c, Parameter p, SuperConstructorInvocationStmt sup | c = sink.getConstructor() and - p = c.getParameter(argi) and + p = c.getParameter(pragma[only_bind_into](argi)) and sup.getEnclosingCallable() = c and constructorStep(p.getAnAccess(), sup, model) ) or // a custom InputStream that wraps a tainted data source is tainted model = "inputStreamWrapper" and - inputStreamWrapper(sink.getConstructor(), argi) + inputStreamWrapper(sink.getConstructor(), pragma[only_bind_into](argi)) or model = "TaintPreservingCallable" and - sink.getConstructor().(TaintPreservingCallable).returnsTaintFrom(argToParam(sink, argi)) + sink.getConstructor() + .(TaintPreservingCallable) + .returnsTaintFrom(argToParam(sink, pragma[only_bind_into](argi))) ) } diff --git a/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll b/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll index a9988e920c62..bd293eed6b3a 100644 --- a/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll +++ b/java/ql/lib/semmle/code/java/dispatch/DispatchFlow.qll @@ -5,8 +5,6 @@ * data flow check for lambdas, anonymous classes, and other sufficiently * private classes where all object instantiations are accounted for. */ -overlay[local?] -module; import java private import VirtualDispatch diff --git a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll index 86915f802743..a3da9118acc7 100644 --- a/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll +++ b/java/ql/lib/semmle/code/java/dispatch/ObjFlow.qll @@ -6,8 +6,6 @@ * The set of dispatch targets for `Object.toString()` calls are reduced based * on possible data flow from objects of more specific types to the qualifier. */ -overlay[local?] -module; import java private import VirtualDispatch diff --git a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll index 877a62fb9455..78bf1ad0bdc1 100644 --- a/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll +++ b/java/ql/lib/semmle/code/java/dispatch/VirtualDispatch.qll @@ -2,8 +2,6 @@ * Provides predicates for reasoning about runtime call targets through virtual * dispatch. */ -overlay[local?] -module; import java import semmle.code.java.dataflow.TypeFlow diff --git a/java/ql/lib/semmle/code/java/dispatch/internal/Unification.qll b/java/ql/lib/semmle/code/java/dispatch/internal/Unification.qll index cd585de58e4e..6c92f7298d92 100644 --- a/java/ql/lib/semmle/code/java/dispatch/internal/Unification.qll +++ b/java/ql/lib/semmle/code/java/dispatch/internal/Unification.qll @@ -1,8 +1,6 @@ /** * Provides a module to check whether two `ParameterizedType`s are unifiable. */ -overlay[local?] -module; import java diff --git a/java/ql/lib/semmle/code/java/frameworks/Assertions.qll b/java/ql/lib/semmle/code/java/frameworks/Assertions.qll index 9849be5f3603..49afcb7a3e18 100644 --- a/java/ql/lib/semmle/code/java/frameworks/Assertions.qll +++ b/java/ql/lib/semmle/code/java/frameworks/Assertions.qll @@ -1,4 +1,6 @@ /** + * DEPRECATED. + * * A library providing uniform access to various assertion frameworks. * * Currently supports `org.junit.Assert`, `junit.framework.*`, @@ -6,7 +8,7 @@ * and `java.util.Objects`. */ overlay[local?] -module; +deprecated module; import java diff --git a/java/ql/lib/semmle/code/java/frameworks/android/ExternalStorage.qll b/java/ql/lib/semmle/code/java/frameworks/android/ExternalStorage.qll index c07ddea6dbab..6dd49fc7ff64 100644 --- a/java/ql/lib/semmle/code/java/frameworks/android/ExternalStorage.qll +++ b/java/ql/lib/semmle/code/java/frameworks/android/ExternalStorage.qll @@ -20,8 +20,10 @@ private predicate externalStorageFlowStep(DataFlow::Node node1, DataFlow::Node n node2.asExpr().(FieldRead).getField().getInitializer() = node1.asExpr() } -private predicate externalStorageFlow(DataFlow::Node node1, DataFlow::Node node2) { - externalStorageFlowStep*(node1, node2) +private predicate externalStorageDirFlowsTo(DataFlow::Node n) { + sourceNode(n, "android-external-storage-dir") + or + exists(DataFlow::Node mid | externalStorageDirFlowsTo(mid) and externalStorageFlowStep(mid, n)) } /** @@ -29,9 +31,8 @@ private predicate externalStorageFlow(DataFlow::Node node1, DataFlow::Node node2 * This is controllable by third-party applications, so is treated as a remote flow source. */ predicate androidExternalStorageSource(DataFlow::Node n) { - exists(DataFlow::Node externalDir, DirectFileReadExpr read | - sourceNode(externalDir, "android-external-storage-dir") and + exists(DirectFileReadExpr read | n.asExpr() = read and - externalStorageFlow(externalDir, DataFlow::exprNode(read.getFileExpr())) + externalStorageDirFlowsTo(DataFlow::exprNode(read.getFileExpr())) ) } diff --git a/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/old.dbscheme b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/old.dbscheme new file mode 100644 index 000000000000..1b8f5f4c747e --- /dev/null +++ b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/old.dbscheme @@ -0,0 +1,1236 @@ +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * javac A.java B.java C.java + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * javac A.java B.java C.java + */ + unique int id : @compilation, + int kind: int ref, + string cwd : string ref, + string name : string ref +); + +case @compilation.kind of + 1 = @javacompilation +| 2 = @kotlincompilation +; + +compilation_started( + int id : @compilation 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 + * + * javac A.java B.java C.java + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--javac-args` + * 2 | A.java + * 3 | B.java + * 4 | C.java + */ +#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` 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 + * + * javac A.java B.java C.java + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | A.java + * 1 | B.java + * 2 | C.java + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * For each file recorded in `compilation_compiling_files`, + * there will be a corresponding row in + * `compilation_compiling_files_completed` once extraction + * of that file is complete. The `result` will indicate the + * extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +#keyset[id, num] +compilation_compiling_files_completed( + int id : @compilation ref, + int num : int ref, + int result : int 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 +); + +/** + * The `cpu_seconds` and `elapsed_seconds` are the CPU time and elapsed + * time (respectively) that the original compilation (not the extraction) + * took for compiler invocation `id`. + */ +compilation_compiler_times( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float 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`. + * The `result` will indicate the extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref, + int result : int ref +); + +diagnostics( + unique int id: @diagnostic, + string generated_by: string ref, // TODO: Sync this with the other languages? + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/** + * 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 +); + +/* + * External artifacts + */ + +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +sourceLocationPrefix( + string prefix : string ref +); + +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path: string ref +); + +/* + * SMAP + */ + +smap_header( + int outputFileId: @file ref, + string outputFilename: string ref, + string defaultStratum: string ref +); + +smap_files( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + string inputFileName: string ref, + int inputFileId: @file ref +); + +smap_lines( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + int inputStartLine: int ref, + int inputLineCount: int ref, + int outputStartLine: int ref, + int outputLineIncrement: int ref +); + +/* + * Locations and files + */ + +@location = @location_default ; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +hasLocation( + int locatableid: @locatable ref, + int id: @location ref +); + +@sourceline = @locatable ; + +#keyset[element_id] +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int 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 +); + +/* + * Java + */ + +cupackage( + unique int id: @file ref, + int packageid: @package ref +); + +#keyset[fileid,keyName] +jarManifestMain( + int fileid: @file ref, + string keyName: string ref, + string value: string ref +); + +#keyset[fileid,entryName,keyName] +jarManifestEntries( + int fileid: @file ref, + string entryName: string ref, + string keyName: string ref, + string value: string ref +); + +packages( + unique int id: @package, + string nodeName: string ref +); + +primitives( + unique int id: @primitive, + string nodeName: string ref +); + +modifiers( + unique int id: @modifier, + string nodeName: string ref +); + +/** + * An errortype is used when the extractor is unable to extract a type + * correctly for some reason. + */ +error_type( + unique int id: @errortype +); + +classes_or_interfaces( + unique int id: @classorinterface, + string nodeName: string ref, + int parentid: @package ref, + int sourceid: @classorinterface ref +); + +file_class( + int id: @classorinterface ref +); + +class_object( + unique int id: @classorinterface ref, + unique int instance: @field ref +); + +type_companion_object( + unique int id: @classorinterface ref, + unique int instance: @field ref, + unique int companion_object: @classorinterface ref +); + +kt_nullable_types( + unique int id: @kt_nullable_type, + int classid: @reftype ref +) + +kt_notnull_types( + unique int id: @kt_notnull_type, + int classid: @reftype ref +) + +kt_type_alias( + unique int id: @kt_type_alias, + string name: string ref, + int kttypeid: @kt_type ref +) + +@kt_type = @kt_nullable_type | @kt_notnull_type + +isInterface( + unique int id: @classorinterface ref +); + +isRecord( + unique int id: @classorinterface ref +); + +fielddecls( + unique int id: @fielddecl, + int parentid: @reftype ref +); + +#keyset[fieldId] #keyset[fieldDeclId,pos] +fieldDeclaredIn( + int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref +); + +fields( + unique int id: @field, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref +); + +fieldsKotlinType( + unique int id: @field ref, + int kttypeid: @kt_type ref +); + +constrs( + unique int id: @constructor, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref +); + +constrsKotlinType( + unique int id: @constructor ref, + int kttypeid: @kt_type ref +); + +methods( + unique int id: @method, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref +); + +methodsKotlinType( + unique int id: @method ref, + int kttypeid: @kt_type ref +); + +#keyset[parentid,pos] +params( + unique int id: @param, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref +); + +paramsKotlinType( + unique int id: @param ref, + int kttypeid: @kt_type ref +); + +paramName( + unique int id: @param ref, + string nodeName: string ref +); + +isVarargsParam( + int param: @param ref +); + +exceptions( + unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref +); + +isAnnotType( + int interfaceid: @classorinterface ref +); + +isAnnotElem( + int methodid: @method ref +); + +annotValue( + int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref +); + +isEnumType( + int classid: @classorinterface ref +); + +isEnumConst( + int fieldid: @field ref +); + +#keyset[parentid,pos] +typeVars( + unique int id: @typevariable, + string nodeName: string ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +wildcards( + unique int id: @wildcard, + string nodeName: string ref, + int kind: int ref +); + +#keyset[parentid,pos] +typeBounds( + unique int id: @typebound, + int typeid: @reftype ref, + int pos: int ref, + int parentid: @boundedtype ref +); + +#keyset[parentid,pos] +typeArgs( + int argumentid: @reftype ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +isParameterized( + int memberid: @member ref +); + +isRaw( + int memberid: @member ref +); + +#keyset[classid] #keyset[parent] +isAnonymClass( + int classid: @classorinterface ref, + int parent: @classinstancexpr ref +); + +#keyset[typeid] #keyset[parent] +isLocalClassOrInterface( + int typeid: @classorinterface ref, + int parent: @localtypedeclstmt ref +); + +isDefConstr( + int constructorid: @constructor ref +); + +#keyset[exprId] +lambdaKind( + int exprId: @lambdaexpr ref, + int bodyKind: int ref +); + +isCanonicalConstr( + int constructorid: @constructor ref +); + +arrays( + unique int id: @array, + string nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref +); + +enclInReftype( + unique int child: @reftype ref, + int parent: @reftype ref +); + +extendsReftype( + int id1: @reftype ref, + int id2: @classorinterface ref +); + +implInterface( + int id1: @classorarray ref, + int id2: @classorinterface ref +); + +permits( + int id1: @classorinterface ref, + int id2: @classorinterface ref +); + +hasModifier( + int id1: @modifiable ref, + int id2: @modifier ref +); + +imports( + unique int id: @import, + int holder: @classorinterfaceorpackage ref, + string name: string ref, + int kind: int ref +); + +#keyset[parent,idx] +stmts( + unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref +); + +@stmtparent = @callable | @stmt | @switchexpr | @whenexpr| @stmtexpr; + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localtypedeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause +| 23 = @yieldstmt +| 24 = @errorstmt +| 25 = @whenbranch +; + +#keyset[parent,idx] +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @exprparent ref, + int idx: int ref +); + +exprsKotlinType( + unique int id: @expr ref, + int kttypeid: @kt_type ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +isParenthesized( + unique int id: @expr ref, + int parentheses: int ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @newexpr +| 53 = @conditionalexpr +| 54 = @parexpr // deprecated +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @unannotatedtypeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @declannotation +| 67 = @uniontypeaccess +| 68 = @lambdaexpr +| 69 = @memberref +| 70 = @annotatedtypeaccess +| 71 = @typeannotation +| 72 = @intersectiontypeaccess +| 73 = @switchexpr +| 74 = @errorexpr +| 75 = @whenexpr +| 76 = @getclassexpr +| 77 = @safecastexpr +| 78 = @implicitcastexpr +| 79 = @implicitnotnullexpr +| 80 = @implicitcoerciontounitexpr +| 81 = @notinstanceofexpr +| 82 = @stmtexpr +| 83 = @stringtemplateexpr +| 84 = @notnullexpr +| 85 = @unsafecoerceexpr +| 86 = @valueeqexpr +| 87 = @valueneexpr +| 88 = @propertyref +| 89 = @recordpatternexpr +; + +/** Holds if this `when` expression was written as an `if` expression. */ +when_if(unique int id: @whenexpr ref); + +/** Holds if this `when` branch was written as an `else` branch. */ +when_branch_else(unique int id: @whenbranch ref); + +@classinstancexpr = @newexpr | @lambdaexpr | @memberref | @propertyref + +@annotation = @declannotation | @typeannotation +@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr + | @valueeqexpr + | @valueneexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr + | @notnullexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +callableBinding( + unique int callerid: @caller ref, + int callee: @callable ref +); + +memberRefBinding( + unique int id: @expr ref, + int callable: @callable ref +); + +propertyRefGetBinding( + unique int id: @expr ref, + int getter: @callable ref +); + +propertyRefFieldBinding( + unique int id: @expr ref, + int field: @field ref +); + +propertyRefSetBinding( + unique int id: @expr ref, + int setter: @callable ref +); + +@exprparent = @stmt | @expr | @whenbranch | @callable | @field | @fielddecl | @classorinterface | @param | @localvar | @typevariable; + +variableBinding( + unique int expr: @varaccess ref, + int variable: @variable ref +); + +@variable = @localscopevariable | @field; + +@localscopevariable = @localvar | @param; + +localvars( + unique int id: @localvar, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref +); + +localvarsKotlinType( + unique int id: @localvar ref, + int kttypeid: @kt_type ref +); + +@namedexprorstmt = @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings( + string name: string ref, + string value: string ref, + unique int parent: @namedexprorstmt ref +); + +/* + * Modules + */ + +#keyset[name] +modules( + unique int id: @module, + string name: string ref +); + +isOpen( + int id: @module ref +); + +#keyset[fileId] +cumodule( + int fileId: @file ref, + int moduleId: @module ref +); + +@directive = @requires + | @exports + | @opens + | @uses + | @provides + +#keyset[directive] +directives( + int id: @module ref, + int directive: @directive ref +); + +requires( + unique int id: @requires, + int target: @module ref +); + +isTransitive( + int id: @requires ref +); + +isStatic( + int id: @requires ref +); + +exports( + unique int id: @exports, + int target: @package ref +); + +exportsTo( + int id: @exports ref, + int target: @module ref +); + +opens( + unique int id: @opens, + int target: @package ref +); + +opensTo( + int id: @opens ref, + int target: @module ref +); + +uses( + unique int id: @uses, + string serviceInterface: string ref +); + +provides( + unique int id: @provides, + string serviceInterface: string ref +); + +providesWith( + int id: @provides ref, + string serviceImpl: string ref +); + +isNullDefaultCase( + int id: @case ref +); + +/* + * Javadoc + */ + +javadoc( + unique int id: @javadoc +); + +isNormalComment( + int commentid : @javadoc ref +); + +isEolComment( + int commentid : @javadoc ref +); + +hasJavadoc( + int documentableid: @member ref, + int javadocid: @javadoc ref +); + +#keyset[parentid,idx] +javadocTag( + unique int id: @javadocTag, + string name: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +#keyset[parentid,idx] +javadocText( + unique int id: @javadocText, + string text: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +@classorinterfaceorpackage = @classorinterface | @package; +@classorinterfaceorcallable = @classorinterface | @callable; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype | @errortype; +@classorarray = @classorinterface | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; + +/** A program element that has a name. */ +@element = @package | @modifier | @annotation | @errortype | + @locatableElement; + +@locatableElement = @file | @primitive | @classorinterface | @method | @constructor | @param | @exception | @field | + @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias | + @kt_property; + +@modifiable = @member_modifiable| @param | @localvar | @typevariable; + +@member_modifiable = @classorinterface | @method | @constructor | @field | @kt_property; + +@member = @method | @constructor | @field | @reftype ; + +/** A program element that has a location. */ +@locatable = @typebound | @javadoc | @javadocTag | @javadocText | @xmllocatable | @ktcomment | + @locatableElement; + +@top = @element | @locatable | @folder; + +/* + * 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; + +/* + * configuration files with key value pairs + */ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +ktComments( + unique int id: @ktcomment, + int kind: int ref, + string text : string ref +) + +ktCommentSections( + unique int id: @ktcommentsection, + int comment: @ktcomment ref, + string content : string ref +) + +ktCommentSectionNames( + unique int id: @ktcommentsection ref, + string name : string ref +) + +ktCommentSectionSubjectNames( + unique int id: @ktcommentsection ref, + string subjectname : string ref +) + +#keyset[id, owner] +ktCommentOwners( + int id: @ktcomment ref, + int owner: @top ref +) + +ktExtensionFunctions( + unique int id: @method ref, + int typeid: @type ref, + int kttypeid: @kt_type ref +) + +ktProperties( + unique int id: @kt_property, + string nodeName: string ref +) + +ktPropertyGetters( + unique int id: @kt_property ref, + int getter: @method ref +) + +ktPropertySetters( + unique int id: @kt_property ref, + int setter: @method ref +) + +ktPropertyBackingFields( + unique int id: @kt_property ref, + int backingField: @field ref +) + +ktSyntheticBody( + unique int id: @callable ref, + int kind: int ref + // 1: ENUM_VALUES + // 2: ENUM_VALUEOF + // 3: ENUM_ENTRIES +) + +ktLocalFunction( + unique int id: @method ref +) + +ktInitializerAssignment( + unique int id: @assignexpr ref +) + +ktPropertyDelegates( + unique int id: @kt_property ref, + unique int variableId: @variable ref +) + +/** + * If `id` is a compiler generated element, then the kind indicates the + * reason that the compiler generated it. + * See `Element.compilerGeneratedReason()` for an explanation of what + * each `kind` means. + */ +compiler_generated( + unique int id: @element ref, + int kind: int ref +) + +ktFunctionOriginalNames( + unique int id: @method ref, + string name: string ref +) + +ktDataClasses( + unique int id: @classorinterface ref +) diff --git a/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/semmlecode.dbscheme b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/semmlecode.dbscheme new file mode 100644 index 000000000000..9f6026c40099 --- /dev/null +++ b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/semmlecode.dbscheme @@ -0,0 +1,1240 @@ +/** + * An invocation of the compiler. Note that more than one file may be + * compiled per invocation. For example, this command compiles three + * source files: + * + * javac A.java B.java C.java + * + * The `id` simply identifies the invocation, while `cwd` is the working + * directory from which the compiler was invoked. + */ +compilations( + /** + * An invocation of the compiler. Note that more than one file may + * be compiled per invocation. For example, this command compiles + * three source files: + * + * javac A.java B.java C.java + */ + unique int id : @compilation, + int kind: int ref, + string cwd : string ref, + string name : string ref +); + +case @compilation.kind of + 1 = @javacompilation +| 2 = @kotlincompilation +; + +compilation_started( + int id : @compilation 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 + * + * javac A.java B.java C.java + * + * then typically there will be rows for + * + * num | arg + * --- | --- + * 0 | *path to extractor* + * 1 | `--javac-args` + * 2 | A.java + * 3 | B.java + * 4 | C.java + */ +#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` 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 + * + * javac A.java B.java C.java + * + * then there will be rows for + * + * num | arg + * --- | --- + * 0 | A.java + * 1 | B.java + * 2 | C.java + */ +#keyset[id, num] +compilation_compiling_files( + int id : @compilation ref, + int num : int ref, + int file : @file ref +); + +/** + * For each file recorded in `compilation_compiling_files`, + * there will be a corresponding row in + * `compilation_compiling_files_completed` once extraction + * of that file is complete. The `result` will indicate the + * extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +#keyset[id, num] +compilation_compiling_files_completed( + int id : @compilation ref, + int num : int ref, + int result : int 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 +); + +/** + * The `cpu_seconds` and `elapsed_seconds` are the CPU time and elapsed + * time (respectively) that the original compilation (not the extraction) + * took for compiler invocation `id`. + */ +compilation_compiler_times( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float 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`. + * The `result` will indicate the extraction result: + * + * 0: Successfully extracted + * 1: Errors were encountered, but extraction recovered + * 2: Errors were encountered, and extraction could not recover + */ +compilation_finished( + unique int id : @compilation ref, + float cpu_seconds : float ref, + float elapsed_seconds : float ref, + int result : int ref +); + +diagnostics( + unique int id: @diagnostic, + string generated_by: string ref, // TODO: Sync this with the other languages? + int severity: int ref, + string error_tag: string ref, + string error_message: string ref, + string full_error_message: string ref, + int location: @location_default ref +); + +/** + * 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 +); + +/* + * External artifacts + */ + +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +sourceLocationPrefix( + string prefix : string ref +); + +databaseMetadata( + string metadataKey : string ref, + string value : string ref +); + +overlayChangedFiles( + string path: string ref +); + +/* + * SMAP + */ + +smap_header( + int outputFileId: @file ref, + string outputFilename: string ref, + string defaultStratum: string ref +); + +smap_files( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + string inputFileName: string ref, + int inputFileId: @file ref +); + +smap_lines( + int outputFileId: @file ref, + string stratum: string ref, + int inputFileNum: int ref, + int inputStartLine: int ref, + int inputLineCount: int ref, + int outputStartLine: int ref, + int outputLineIncrement: int ref +); + +/* + * Locations and files + */ + +@location = @location_default ; + +locations_default( + unique int id: @location_default, + int file: @file ref, + int beginLine: int ref, + int beginColumn: int ref, + int endLine: int ref, + int endColumn: int ref +); + +hasLocation( + int locatableid: @locatable ref, + int id: @location ref +); + +@sourceline = @locatable ; + +#keyset[element_id] +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int 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 +); + +/* + * Java + */ + +cupackage( + unique int id: @file ref, + int packageid: @package ref +); + +#keyset[fileid,keyName] +jarManifestMain( + int fileid: @file ref, + string keyName: string ref, + string value: string ref +); + +#keyset[fileid,entryName,keyName] +jarManifestEntries( + int fileid: @file ref, + string entryName: string ref, + string keyName: string ref, + string value: string ref +); + +packages( + unique int id: @package, + string nodeName: string ref +); + +primitives( + unique int id: @primitive, + string nodeName: string ref +); + +modifiers( + unique int id: @modifier, + string nodeName: string ref +); + +/** + * An errortype is used when the extractor is unable to extract a type + * correctly for some reason. + */ +error_type( + unique int id: @errortype +); + +classes_or_interfaces( + unique int id: @classorinterface, + string nodeName: string ref, + int parentid: @package ref, + int sourceid: @classorinterface ref +); + +file_class( + int id: @classorinterface ref +); + +class_object( + unique int id: @classorinterface ref, + unique int instance: @field ref +); + +type_companion_object( + unique int id: @classorinterface ref, + unique int instance: @field ref, + unique int companion_object: @classorinterface ref +); + +kt_nullable_types( + unique int id: @kt_nullable_type, + int classid: @reftype ref +) + +kt_notnull_types( + unique int id: @kt_notnull_type, + int classid: @reftype ref +) + +kt_type_alias( + unique int id: @kt_type_alias, + string name: string ref, + int kttypeid: @kt_type ref +) + +@kt_type = @kt_nullable_type | @kt_notnull_type + +isInterface( + unique int id: @classorinterface ref +); + +isRecord( + unique int id: @classorinterface ref +); + +fielddecls( + unique int id: @fielddecl, + int parentid: @reftype ref +); + +#keyset[fieldId] #keyset[fieldDeclId,pos] +fieldDeclaredIn( + int fieldId: @field ref, + int fieldDeclId: @fielddecl ref, + int pos: int ref +); + +fields( + unique int id: @field, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @reftype ref +); + +fieldsKotlinType( + unique int id: @field ref, + int kttypeid: @kt_type ref +); + +constrs( + unique int id: @constructor, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @constructor ref +); + +constrsKotlinType( + unique int id: @constructor ref, + int kttypeid: @kt_type ref +); + +methods( + unique int id: @method, + string nodeName: string ref, + string signature: string ref, + int typeid: @type ref, + int parentid: @reftype ref, + int sourceid: @method ref +); + +methodsKotlinType( + unique int id: @method ref, + int kttypeid: @kt_type ref +); + +#keyset[parentid,pos] +params( + unique int id: @param, + int typeid: @type ref, + int pos: int ref, + int parentid: @callable ref, + int sourceid: @param ref +); + +paramsKotlinType( + unique int id: @param ref, + int kttypeid: @kt_type ref +); + +paramName( + unique int id: @param ref, + string nodeName: string ref +); + +isVarargsParam( + int param: @param ref +); + +exceptions( + unique int id: @exception, + int typeid: @type ref, + int parentid: @callable ref +); + +isAnnotType( + int interfaceid: @classorinterface ref +); + +isAnnotElem( + int methodid: @method ref +); + +annotValue( + int parentid: @annotation ref, + int id2: @method ref, + unique int value: @expr ref +); + +isEnumType( + int classid: @classorinterface ref +); + +isEnumConst( + int fieldid: @field ref +); + +#keyset[parentid,pos] +typeVars( + unique int id: @typevariable, + string nodeName: string ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +wildcards( + unique int id: @wildcard, + string nodeName: string ref, + int kind: int ref +); + +#keyset[parentid,pos] +typeBounds( + unique int id: @typebound, + int typeid: @reftype ref, + int pos: int ref, + int parentid: @boundedtype ref +); + +#keyset[parentid,pos] +typeArgs( + int argumentid: @reftype ref, + int pos: int ref, + int parentid: @classorinterfaceorcallable ref +); + +isParameterized( + int memberid: @member ref +); + +isRaw( + int memberid: @member ref +); + +#keyset[classid] #keyset[parent] +isAnonymClass( + int classid: @classorinterface ref, + int parent: @classinstancexpr ref +); + +#keyset[typeid] #keyset[parent] +isLocalClassOrInterface( + int typeid: @classorinterface ref, + int parent: @localtypedeclstmt ref +); + +isImplicitClass( + unique int classid: @classorinterface ref +); + +isDefConstr( + int constructorid: @constructor ref +); + +#keyset[exprId] +lambdaKind( + int exprId: @lambdaexpr ref, + int bodyKind: int ref +); + +isCanonicalConstr( + int constructorid: @constructor ref +); + +arrays( + unique int id: @array, + string nodeName: string ref, + int elementtypeid: @type ref, + int dimension: int ref, + int componenttypeid: @type ref +); + +enclInReftype( + unique int child: @reftype ref, + int parent: @reftype ref +); + +extendsReftype( + int id1: @reftype ref, + int id2: @classorinterface ref +); + +implInterface( + int id1: @classorarray ref, + int id2: @classorinterface ref +); + +permits( + int id1: @classorinterface ref, + int id2: @classorinterface ref +); + +hasModifier( + int id1: @modifiable ref, + int id2: @modifier ref +); + +imports( + unique int id: @import, + int holder: @classorinterfaceorpackage ref, + string name: string ref, + int kind: int ref +); + +#keyset[parent,idx] +stmts( + unique int id: @stmt, + int kind: int ref, + int parent: @stmtparent ref, + int idx: int ref, + int bodydecl: @callable ref +); + +@stmtparent = @callable | @stmt | @switchexpr | @whenexpr| @stmtexpr; + +case @stmt.kind of + 0 = @block +| 1 = @ifstmt +| 2 = @forstmt +| 3 = @enhancedforstmt +| 4 = @whilestmt +| 5 = @dostmt +| 6 = @trystmt +| 7 = @switchstmt +| 8 = @synchronizedstmt +| 9 = @returnstmt +| 10 = @throwstmt +| 11 = @breakstmt +| 12 = @continuestmt +| 13 = @emptystmt +| 14 = @exprstmt +| 15 = @labeledstmt +| 16 = @assertstmt +| 17 = @localvariabledeclstmt +| 18 = @localtypedeclstmt +| 19 = @constructorinvocationstmt +| 20 = @superconstructorinvocationstmt +| 21 = @case +| 22 = @catchclause +| 23 = @yieldstmt +| 24 = @errorstmt +| 25 = @whenbranch +; + +#keyset[parent,idx] +exprs( + unique int id: @expr, + int kind: int ref, + int typeid: @type ref, + int parent: @exprparent ref, + int idx: int ref +); + +exprsKotlinType( + unique int id: @expr ref, + int kttypeid: @kt_type ref +); + +callableEnclosingExpr( + unique int id: @expr ref, + int callable_id: @callable ref +); + +statementEnclosingExpr( + unique int id: @expr ref, + int statement_id: @stmt ref +); + +isParenthesized( + unique int id: @expr ref, + int parentheses: int ref +); + +case @expr.kind of + 1 = @arrayaccess +| 2 = @arraycreationexpr +| 3 = @arrayinit +| 4 = @assignexpr +| 5 = @assignaddexpr +| 6 = @assignsubexpr +| 7 = @assignmulexpr +| 8 = @assigndivexpr +| 9 = @assignremexpr +| 10 = @assignandexpr +| 11 = @assignorexpr +| 12 = @assignxorexpr +| 13 = @assignlshiftexpr +| 14 = @assignrshiftexpr +| 15 = @assignurshiftexpr +| 16 = @booleanliteral +| 17 = @integerliteral +| 18 = @longliteral +| 19 = @floatingpointliteral +| 20 = @doubleliteral +| 21 = @characterliteral +| 22 = @stringliteral +| 23 = @nullliteral +| 24 = @mulexpr +| 25 = @divexpr +| 26 = @remexpr +| 27 = @addexpr +| 28 = @subexpr +| 29 = @lshiftexpr +| 30 = @rshiftexpr +| 31 = @urshiftexpr +| 32 = @andbitexpr +| 33 = @orbitexpr +| 34 = @xorbitexpr +| 35 = @andlogicalexpr +| 36 = @orlogicalexpr +| 37 = @ltexpr +| 38 = @gtexpr +| 39 = @leexpr +| 40 = @geexpr +| 41 = @eqexpr +| 42 = @neexpr +| 43 = @postincexpr +| 44 = @postdecexpr +| 45 = @preincexpr +| 46 = @predecexpr +| 47 = @minusexpr +| 48 = @plusexpr +| 49 = @bitnotexpr +| 50 = @lognotexpr +| 51 = @castexpr +| 52 = @newexpr +| 53 = @conditionalexpr +| 54 = @parexpr // deprecated +| 55 = @instanceofexpr +| 56 = @localvariabledeclexpr +| 57 = @typeliteral +| 58 = @thisaccess +| 59 = @superaccess +| 60 = @varaccess +| 61 = @methodaccess +| 62 = @unannotatedtypeaccess +| 63 = @arraytypeaccess +| 64 = @packageaccess +| 65 = @wildcardtypeaccess +| 66 = @declannotation +| 67 = @uniontypeaccess +| 68 = @lambdaexpr +| 69 = @memberref +| 70 = @annotatedtypeaccess +| 71 = @typeannotation +| 72 = @intersectiontypeaccess +| 73 = @switchexpr +| 74 = @errorexpr +| 75 = @whenexpr +| 76 = @getclassexpr +| 77 = @safecastexpr +| 78 = @implicitcastexpr +| 79 = @implicitnotnullexpr +| 80 = @implicitcoerciontounitexpr +| 81 = @notinstanceofexpr +| 82 = @stmtexpr +| 83 = @stringtemplateexpr +| 84 = @notnullexpr +| 85 = @unsafecoerceexpr +| 86 = @valueeqexpr +| 87 = @valueneexpr +| 88 = @propertyref +| 89 = @recordpatternexpr +; + +/** Holds if this `when` expression was written as an `if` expression. */ +when_if(unique int id: @whenexpr ref); + +/** Holds if this `when` branch was written as an `else` branch. */ +when_branch_else(unique int id: @whenbranch ref); + +@classinstancexpr = @newexpr | @lambdaexpr | @memberref | @propertyref + +@annotation = @declannotation | @typeannotation +@typeaccess = @unannotatedtypeaccess | @annotatedtypeaccess + +@assignment = @assignexpr + | @assignop; + +@unaryassignment = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr; + +@assignop = @assignaddexpr + | @assignsubexpr + | @assignmulexpr + | @assigndivexpr + | @assignremexpr + | @assignandexpr + | @assignorexpr + | @assignxorexpr + | @assignlshiftexpr + | @assignrshiftexpr + | @assignurshiftexpr; + +@literal = @booleanliteral + | @integerliteral + | @longliteral + | @floatingpointliteral + | @doubleliteral + | @characterliteral + | @stringliteral + | @nullliteral; + +@binaryexpr = @mulexpr + | @divexpr + | @remexpr + | @addexpr + | @subexpr + | @lshiftexpr + | @rshiftexpr + | @urshiftexpr + | @andbitexpr + | @orbitexpr + | @xorbitexpr + | @andlogicalexpr + | @orlogicalexpr + | @ltexpr + | @gtexpr + | @leexpr + | @geexpr + | @eqexpr + | @neexpr + | @valueeqexpr + | @valueneexpr; + +@unaryexpr = @postincexpr + | @postdecexpr + | @preincexpr + | @predecexpr + | @minusexpr + | @plusexpr + | @bitnotexpr + | @lognotexpr + | @notnullexpr; + +@caller = @classinstancexpr + | @methodaccess + | @constructorinvocationstmt + | @superconstructorinvocationstmt; + +callableBinding( + unique int callerid: @caller ref, + int callee: @callable ref +); + +memberRefBinding( + unique int id: @expr ref, + int callable: @callable ref +); + +propertyRefGetBinding( + unique int id: @expr ref, + int getter: @callable ref +); + +propertyRefFieldBinding( + unique int id: @expr ref, + int field: @field ref +); + +propertyRefSetBinding( + unique int id: @expr ref, + int setter: @callable ref +); + +@exprparent = @stmt | @expr | @whenbranch | @callable | @field | @fielddecl | @classorinterface | @param | @localvar | @typevariable; + +variableBinding( + unique int expr: @varaccess ref, + int variable: @variable ref +); + +@variable = @localscopevariable | @field; + +@localscopevariable = @localvar | @param; + +localvars( + unique int id: @localvar, + string nodeName: string ref, + int typeid: @type ref, + int parentid: @localvariabledeclexpr ref +); + +localvarsKotlinType( + unique int id: @localvar ref, + int kttypeid: @kt_type ref +); + +@namedexprorstmt = @breakstmt + | @continuestmt + | @labeledstmt + | @literal; + +namestrings( + string name: string ref, + string value: string ref, + unique int parent: @namedexprorstmt ref +); + +/* + * Modules + */ + +#keyset[name] +modules( + unique int id: @module, + string name: string ref +); + +isOpen( + int id: @module ref +); + +#keyset[fileId] +cumodule( + int fileId: @file ref, + int moduleId: @module ref +); + +@directive = @requires + | @exports + | @opens + | @uses + | @provides + +#keyset[directive] +directives( + int id: @module ref, + int directive: @directive ref +); + +requires( + unique int id: @requires, + int target: @module ref +); + +isTransitive( + int id: @requires ref +); + +isStatic( + int id: @requires ref +); + +exports( + unique int id: @exports, + int target: @package ref +); + +exportsTo( + int id: @exports ref, + int target: @module ref +); + +opens( + unique int id: @opens, + int target: @package ref +); + +opensTo( + int id: @opens ref, + int target: @module ref +); + +uses( + unique int id: @uses, + string serviceInterface: string ref +); + +provides( + unique int id: @provides, + string serviceInterface: string ref +); + +providesWith( + int id: @provides ref, + string serviceImpl: string ref +); + +isNullDefaultCase( + int id: @case ref +); + +/* + * Javadoc + */ + +javadoc( + unique int id: @javadoc +); + +isNormalComment( + int commentid : @javadoc ref +); + +isEolComment( + int commentid : @javadoc ref +); + +hasJavadoc( + int documentableid: @member ref, + int javadocid: @javadoc ref +); + +#keyset[parentid,idx] +javadocTag( + unique int id: @javadocTag, + string name: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +#keyset[parentid,idx] +javadocText( + unique int id: @javadocText, + string text: string ref, + int parentid: @javadocParent ref, + int idx: int ref +); + +@javadocParent = @javadoc | @javadocTag; +@javadocElement = @javadocTag | @javadocText; + +@classorinterfaceorpackage = @classorinterface | @package; +@classorinterfaceorcallable = @classorinterface | @callable; +@boundedtype = @typevariable | @wildcard; +@reftype = @classorinterface | @array | @boundedtype | @errortype; +@classorarray = @classorinterface | @array; +@type = @primitive | @reftype; +@callable = @method | @constructor; + +/** A program element that has a name. */ +@element = @package | @modifier | @annotation | @errortype | + @locatableElement; + +@locatableElement = @file | @primitive | @classorinterface | @method | @constructor | @param | @exception | @field | + @boundedtype | @array | @localvar | @expr | @stmt | @import | @fielddecl | @kt_type | @kt_type_alias | + @kt_property; + +@modifiable = @member_modifiable| @param | @localvar | @typevariable; + +@member_modifiable = @classorinterface | @method | @constructor | @field | @kt_property; + +@member = @method | @constructor | @field | @reftype ; + +/** A program element that has a location. */ +@locatable = @typebound | @javadoc | @javadocTag | @javadocText | @xmllocatable | @ktcomment | + @locatableElement; + +@top = @element | @locatable | @folder; + +/* + * 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; + +/* + * configuration files with key value pairs + */ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +ktComments( + unique int id: @ktcomment, + int kind: int ref, + string text : string ref +) + +ktCommentSections( + unique int id: @ktcommentsection, + int comment: @ktcomment ref, + string content : string ref +) + +ktCommentSectionNames( + unique int id: @ktcommentsection ref, + string name : string ref +) + +ktCommentSectionSubjectNames( + unique int id: @ktcommentsection ref, + string subjectname : string ref +) + +#keyset[id, owner] +ktCommentOwners( + int id: @ktcomment ref, + int owner: @top ref +) + +ktExtensionFunctions( + unique int id: @method ref, + int typeid: @type ref, + int kttypeid: @kt_type ref +) + +ktProperties( + unique int id: @kt_property, + string nodeName: string ref +) + +ktPropertyGetters( + unique int id: @kt_property ref, + int getter: @method ref +) + +ktPropertySetters( + unique int id: @kt_property ref, + int setter: @method ref +) + +ktPropertyBackingFields( + unique int id: @kt_property ref, + int backingField: @field ref +) + +ktSyntheticBody( + unique int id: @callable ref, + int kind: int ref + // 1: ENUM_VALUES + // 2: ENUM_VALUEOF + // 3: ENUM_ENTRIES +) + +ktLocalFunction( + unique int id: @method ref +) + +ktInitializerAssignment( + unique int id: @assignexpr ref +) + +ktPropertyDelegates( + unique int id: @kt_property ref, + unique int variableId: @variable ref +) + +/** + * If `id` is a compiler generated element, then the kind indicates the + * reason that the compiler generated it. + * See `Element.compilerGeneratedReason()` for an explanation of what + * each `kind` means. + */ +compiler_generated( + unique int id: @element ref, + int kind: int ref +) + +ktFunctionOriginalNames( + unique int id: @method ref, + string name: string ref +) + +ktDataClasses( + unique int id: @classorinterface ref +) diff --git a/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/upgrade.properties b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/upgrade.properties new file mode 100644 index 000000000000..3ecad4ebaa4b --- /dev/null +++ b/java/ql/lib/upgrades/1b8f5f4c747e4249f4731796ccaa0661c7434d8a/upgrade.properties @@ -0,0 +1,2 @@ +description: Add support for Java 25 compact source files by introducing isImplicitClass table +compatibility: full diff --git a/java/ql/src/CHANGELOG.md b/java/ql/src/CHANGELOG.md index ffd5648cddf5..022442a1628a 100644 --- a/java/ql/src/CHANGELOG.md +++ b/java/ql/src/CHANGELOG.md @@ -1,3 +1,13 @@ +## 1.8.0 + +### Major Analysis Improvements + +* The implementation of `java/dereferenced-value-may-be-null` has been completely replaced with a new general control-flow reachability library. This improves precision by reducing false positives. However, since the entire calculation has been reworked, there can be small corner cases where precision regressions might occur and new false positives may occur, but these cases should be rare. + +### Bug Fixes + +* The message for `java/diagnostic/database-quality` has been updated to include detailed database health metrics. Additionally, the threshold for reporting database health issues has been lowered from 95% to 85% (if any metric falls below this percentage). These changes are visible on the tool status page. + ## 1.7.0 ### New Queries diff --git a/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql b/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql index 497aa10cb4de..92b257bbfc1a 100644 --- a/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql +++ b/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql @@ -99,14 +99,14 @@ predicate containerAccess(string package, string type, int p, string signature, class MismatchedContainerAccess extends MethodCall { MismatchedContainerAccess() { exists(string package, string type, int i | - containerAccess(package, type, _, this.getCallee().getSignature(), i) + containerAccess(package, type, _, this.getCallee().getSignature(), pragma[only_bind_into](i)) | this.getCallee() .getDeclaringType() .getSourceDeclaration() .getASourceSupertype*() .hasQualifiedName(package, type) and - this.getCallee().getParameter(i).getType() instanceof TypeObject + this.getCallee().getParameter(pragma[only_bind_into](i)).getType() instanceof TypeObject ) } diff --git a/java/ql/src/Likely Bugs/Collections/RemoveTypeMismatch.ql b/java/ql/src/Likely Bugs/Collections/RemoveTypeMismatch.ql index 54548b122e4f..8d45a93e3dd4 100644 --- a/java/ql/src/Likely Bugs/Collections/RemoveTypeMismatch.ql +++ b/java/ql/src/Likely Bugs/Collections/RemoveTypeMismatch.ql @@ -69,14 +69,15 @@ predicate containerModification(string package, string type, int p, string signa class MismatchedContainerModification extends MethodCall { MismatchedContainerModification() { exists(string package, string type, int i | - containerModification(package, type, _, this.getCallee().getSignature(), i) + containerModification(package, type, _, this.getCallee().getSignature(), + pragma[only_bind_into](i)) | this.getCallee() .getDeclaringType() .getASourceSupertype*() .getSourceDeclaration() .hasQualifiedName(package, type) and - this.getCallee().getParameter(i).getType() instanceof TypeObject + this.getCallee().getParameter(pragma[only_bind_into](i)).getType() instanceof TypeObject ) } diff --git a/java/ql/src/Likely Bugs/Frameworks/Swing/BadlyOverriddenAdapter.ql b/java/ql/src/Likely Bugs/Frameworks/Swing/BadlyOverriddenAdapter.ql index 3d4f62707344..ed3ab29c3659 100644 --- a/java/ql/src/Likely Bugs/Frameworks/Swing/BadlyOverriddenAdapter.ql +++ b/java/ql/src/Likely Bugs/Frameworks/Swing/BadlyOverriddenAdapter.ql @@ -24,14 +24,20 @@ class Adapter extends Class { } } -from Class c, Adapter adapter, Method m -where +pragma[nomagic] +predicate candidate(Class c, Adapter adapter, Method m, string name) { adapter = c.getASupertype() and c = m.getDeclaringType() and - exists(Method original | adapter = original.getDeclaringType() | m.getName() = original.getName()) and - not exists(Method overridden | adapter = overridden.getDeclaringType() | m.overrides(overridden)) and + name = m.getName() and // The method is not used for any other purpose. not exists(MethodCall ma | ma.getMethod() = m) +} + +from Class c, Adapter adapter, Method m, string name +where + candidate(c, adapter, m, name) and + exists(Method original | adapter = original.getDeclaringType() | name = original.getName()) and + not exists(Method overridden | adapter = overridden.getDeclaringType() | m.overrides(overridden)) select m, "Method " + m.getName() + " attempts to override a method in " + adapter.getName() + ", but does not have the same argument types. " + m.getName() + diff --git a/java/ql/src/Likely Bugs/Likely Typos/SelfAssignment.ql b/java/ql/src/Likely Bugs/Likely Typos/SelfAssignment.ql index 8116a906910e..fe2286aad1da 100644 --- a/java/ql/src/Likely Bugs/Likely Typos/SelfAssignment.ql +++ b/java/ql/src/Likely Bugs/Likely Typos/SelfAssignment.ql @@ -13,6 +13,7 @@ import java +pragma[nomagic] predicate toCompare(VarAccess left, VarAccess right) { exists(AssignExpr assign | assign.getDest() = left and assign.getSource() = right) or @@ -29,9 +30,10 @@ predicate local(RefType enclosingType, VarAccess v) { not exists(v.getQualifier()) and enclosingType = v.getEnclosingCallable().getDeclaringType() } +pragma[nomagic] predicate sameVariable(VarAccess left, VarAccess right) { toCompare(left, right) and - left.getVariable() = right.getVariable() and + pragma[only_bind_out](left.getVariable()) = pragma[only_bind_out](right.getVariable()) and ( exists(Expr q1, Expr q2 | q1 = left.getQualifier() and @@ -39,7 +41,10 @@ predicate sameVariable(VarAccess left, VarAccess right) { q2 = right.getQualifier() ) or - exists(RefType enclosingType | local(enclosingType, left) and local(enclosingType, right)) + exists(RefType enclosingType | + local(enclosingType, pragma[only_bind_out](left)) and + local(enclosingType, pragma[only_bind_out](right)) + ) ) } diff --git a/java/ql/src/Telemetry/DatabaseQualityDiagnostics.ql b/java/ql/src/Telemetry/DatabaseQualityDiagnostics.ql index 6bbe1d11ee1c..ad58b90bc95c 100644 --- a/java/ql/src/Telemetry/DatabaseQualityDiagnostics.ql +++ b/java/ql/src/Telemetry/DatabaseQualityDiagnostics.ql @@ -8,26 +8,39 @@ import java import DatabaseQuality +private predicate diagnostic(string msg, float value, float threshold) { + CallTargetStatsReport::percentageOfOk(msg, value) and + threshold = 85 + or + ExprTypeStatsReport::percentageOfOk(msg, value) and + threshold = 85 +} + private newtype TDbQualityDiagnostic = TTheDbQualityDiagnostic() { - exists(float percentageGood | - CallTargetStatsReport::percentageOfOk(_, percentageGood) - or - ExprTypeStatsReport::percentageOfOk(_, percentageGood) - | - percentageGood < 95 + exists(float percentageGood, float threshold | + diagnostic(_, percentageGood, threshold) and + percentageGood < threshold ) } +private string getDbHealth() { + result = + strictconcat(string msg, float value, float threshold | + diagnostic(msg, value, threshold) + | + msg + ": " + value.floor() + " % (threshold " + threshold.floor() + " %)", ". " + ) +} + class DbQualityDiagnostic extends TDbQualityDiagnostic { string toString() { result = "Scanning Java code completed successfully, but the scan encountered issues. " + - "This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- " - + - "see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. " - + - "Addressing these warnings is advisable to avoid false-positive or missing results. If they cannot be addressed, consider scanning Java " + "This may be caused by problems identifying dependencies or use of generated source code. " + + "Some metrics of the database quality are: " + getDbHealth() + ". " + + "Ideally these metrics should be above their thresholds. " + + "Addressing these issues is advisable to avoid false-positives or missing results. If they cannot be addressed, consider scanning Java " + "using either the `autobuild` or `manual` [build modes](https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages#comparison-of-the-build-modes)." } diff --git a/java/ql/src/Violations of Best Practice/Dead Code/DeadLocals.qll b/java/ql/src/Violations of Best Practice/Dead Code/DeadLocals.qll index 26c5ed66a86d..5afab52c37e2 100644 --- a/java/ql/src/Violations of Best Practice/Dead Code/DeadLocals.qll +++ b/java/ql/src/Violations of Best Practice/Dead Code/DeadLocals.qll @@ -4,7 +4,7 @@ import java import semmle.code.java.dataflow.SSA -private import semmle.code.java.frameworks.Assertions +private import semmle.code.java.controlflow.internal.Preconditions private predicate emptyDecl(LocalVariableDeclExpr decl) { not exists(decl.getInit()) and @@ -22,7 +22,19 @@ predicate deadLocal(VariableUpdate upd) { /** * A dead variable update that is expected to be dead as indicated by an assertion. */ -predicate expectedDead(VariableUpdate upd) { assertFail(upd.getBasicBlock(), _) } +predicate expectedDead(VariableUpdate upd) { + exists(BasicBlock bb, ControlFlowNode n | + bb = upd.getBasicBlock() and + bb = n.getBasicBlock() + | + methodCallUnconditionallyThrows(n.asExpr()) + or + exists(AssertStmt a | + n.asExpr() = a.getExpr() and + a.getExpr().(BooleanLiteral).getBooleanValue() = false + ) + ) +} /** * A dead update that is overwritten by a live update. diff --git a/java/ql/src/Violations of Best Practice/Naming Conventions/ConfusingOverloading.ql b/java/ql/src/Violations of Best Practice/Naming Conventions/ConfusingOverloading.ql index ed492e5b6a1e..0a1e8785b4ec 100644 --- a/java/ql/src/Violations of Best Practice/Naming Conventions/ConfusingOverloading.ql +++ b/java/ql/src/Violations of Best Practice/Naming Conventions/ConfusingOverloading.ql @@ -66,8 +66,8 @@ private predicate candidateMethod(RefType t, Method m, string name, int numParam predicate paramTypePair(Type t1, Type t2) { exists(Method n, Method m, int i | overloadedMethodsMostSpecific(n, m) and - t1 = n.getParameterType(i) and - t2 = m.getParameterType(i) + t1 = n.getParameterType(pragma[only_bind_into](i)) and + t2 = m.getParameterType(pragma[only_bind_into](i)) ) } @@ -93,6 +93,7 @@ predicate potentiallyConfusingTypesRefTypes(RefType t1, RefType t2) { } // then check hasSubtypeOrInstantiation +pragma[nomagic] predicate potentiallyConfusingTypes(Type t1, Type t2) { potentiallyConfusingTypesSimple(t1, t2) or diff --git a/java/ql/src/change-notes/released/1.8.0.md b/java/ql/src/change-notes/released/1.8.0.md new file mode 100644 index 000000000000..f8da72566e24 --- /dev/null +++ b/java/ql/src/change-notes/released/1.8.0.md @@ -0,0 +1,9 @@ +## 1.8.0 + +### Major Analysis Improvements + +* The implementation of `java/dereferenced-value-may-be-null` has been completely replaced with a new general control-flow reachability library. This improves precision by reducing false positives. However, since the entire calculation has been reworked, there can be small corner cases where precision regressions might occur and new false positives may occur, but these cases should be rare. + +### Bug Fixes + +* The message for `java/diagnostic/database-quality` has been updated to include detailed database health metrics. Additionally, the threshold for reporting database health issues has been lowered from 95% to 85% (if any metric falls below this percentage). These changes are visible on the tool status page. diff --git a/java/ql/src/codeql-pack.release.yml b/java/ql/src/codeql-pack.release.yml index d1184cc67507..dc8a37cc443d 100644 --- a/java/ql/src/codeql-pack.release.yml +++ b/java/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.7.0 +lastReleaseVersion: 1.8.0 diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index 022815c208e1..947cfcb6d134 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.7.0 +version: 1.8.0 groups: - java - queries diff --git a/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected b/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected index b901340b9642..a56980d10ac4 100644 --- a/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected +++ b/java/ql/test-kotlin1/library-tests/java-kotlin-collection-type-generic-methods/test.expected @@ -16,30 +16,6 @@ methodWithDuplicate | AbstractCollection | removeAll | Collection | | AbstractCollection | retainAll | Collection | | AbstractCollection | toArray | T[] | -| AbstractCollection> | add | Entry | -| AbstractCollection> | addAll | Collection> | -| AbstractCollection> | contains | Object | -| AbstractCollection> | containsAll | Collection | -| AbstractCollection> | remove | Object | -| AbstractCollection> | removeAll | Collection | -| AbstractCollection> | retainAll | Collection | -| AbstractCollection> | toArray | T[] | -| AbstractCollection | add | K | -| AbstractCollection | addAll | Collection | -| AbstractCollection | contains | Object | -| AbstractCollection | containsAll | Collection | -| AbstractCollection | remove | Object | -| AbstractCollection | removeAll | Collection | -| AbstractCollection | retainAll | Collection | -| AbstractCollection | toArray | T[] | -| AbstractCollection | add | Runnable | -| AbstractCollection | addAll | Collection | -| AbstractCollection | contains | Object | -| AbstractCollection | containsAll | Collection | -| AbstractCollection | remove | Object | -| AbstractCollection | removeAll | Collection | -| AbstractCollection | retainAll | Collection | -| AbstractCollection | toArray | T[] | | AbstractCollection | add | String | | AbstractCollection | addAll | Collection | | AbstractCollection | contains | Object | @@ -56,14 +32,6 @@ methodWithDuplicate | AbstractCollection | removeAll | Collection | | AbstractCollection | retainAll | Collection | | AbstractCollection | toArray | T[] | -| AbstractCollection | add | V | -| AbstractCollection | addAll | Collection | -| AbstractCollection | contains | Object | -| AbstractCollection | containsAll | Collection | -| AbstractCollection | remove | Object | -| AbstractCollection | removeAll | Collection | -| AbstractCollection | retainAll | Collection | -| AbstractCollection | toArray | T[] | | AbstractList | add | E | | AbstractList | add | int | | AbstractList | addAll | Collection | @@ -103,14 +71,14 @@ methodWithDuplicate | AbstractMap | put | V | | AbstractMap | putAll | Map | | AbstractMap | remove | Object | -| AbstractMap> | containsKey | Object | -| AbstractMap> | containsValue | Object | -| AbstractMap> | equals | Object | -| AbstractMap> | get | Object | -| AbstractMap> | put | Entry | -| AbstractMap> | put | Identity | -| AbstractMap> | putAll | Map> | -| AbstractMap> | remove | Object | +| AbstractMap | containsKey | Object | +| AbstractMap | containsValue | Object | +| AbstractMap | equals | Object | +| AbstractMap | get | Object | +| AbstractMap | put | Identity | +| AbstractMap | put | Object | +| AbstractMap | putAll | Map | +| AbstractMap | remove | Object | | AbstractMap | containsKey | Object | | AbstractMap | containsValue | Object | | AbstractMap | equals | Object | @@ -179,17 +147,6 @@ methodWithDuplicate | Collection | retainAll | Collection | | Collection | toArray | IntFunction | | Collection | toArray | T[] | -| Collection | add | Runnable | -| Collection | addAll | Collection | -| Collection | contains | Object | -| Collection | containsAll | Collection | -| Collection | equals | Object | -| Collection | remove | Object | -| Collection | removeAll | Collection | -| Collection | removeIf | Predicate | -| Collection | retainAll | Collection | -| Collection | toArray | IntFunction | -| Collection | toArray | T[] | | Collection | add | String | | Collection | addAll | Collection | | Collection | contains | Object | @@ -332,37 +289,36 @@ methodWithDuplicate | Map | replace | K | | Map | replace | V | | Map | replaceAll | BiFunction | -| Map> | compute | BiFunction,? extends Entry> | -| Map> | compute | Identity | -| Map> | computeIfAbsent | Function> | -| Map> | computeIfAbsent | Identity | -| Map> | computeIfPresent | BiFunction,? extends Entry> | -| Map> | computeIfPresent | Identity | -| Map> | containsKey | Object | -| Map> | containsValue | Object | -| Map> | copyOf | Map | -| Map> | entry | K | -| Map> | entry | V | -| Map> | equals | Object | -| Map> | forEach | BiConsumer> | -| Map> | get | Object | -| Map> | getOrDefault | Entry | -| Map> | getOrDefault | Object | -| Map> | merge | BiFunction,? super Entry,? extends Entry> | -| Map> | merge | Entry | -| Map> | merge | Identity | -| Map> | of | K | -| Map> | of | V | -| Map> | ofEntries | Entry[] | -| Map> | put | Entry | -| Map> | put | Identity | -| Map> | putAll | Map> | -| Map> | putIfAbsent | Entry | -| Map> | putIfAbsent | Identity | -| Map> | remove | Object | -| Map> | replace | Entry | -| Map> | replace | Identity | -| Map> | replaceAll | BiFunction,? extends Entry> | +| Map | compute | BiFunction | +| Map | compute | Identity | +| Map | computeIfAbsent | Function | +| Map | computeIfAbsent | Identity | +| Map | computeIfPresent | BiFunction | +| Map | computeIfPresent | Identity | +| Map | containsKey | Object | +| Map | containsValue | Object | +| Map | copyOf | Map | +| Map | entry | K | +| Map | entry | V | +| Map | equals | Object | +| Map | forEach | BiConsumer | +| Map | get | Object | +| Map | getOrDefault | Object | +| Map | merge | BiFunction | +| Map | merge | Identity | +| Map | merge | Object | +| Map | of | K | +| Map | of | V | +| Map | ofEntries | Entry[] | +| Map | put | Identity | +| Map | put | Object | +| Map | putAll | Map | +| Map | putIfAbsent | Identity | +| Map | putIfAbsent | Object | +| Map | remove | Object | +| Map | replace | Identity | +| Map | replace | Object | +| Map | replaceAll | BiFunction | | Map | compute | BiFunction | | Map | compute | K | | Map | computeIfAbsent | Function | diff --git a/java/ql/test-kotlin1/library-tests/reflection/reflection.expected b/java/ql/test-kotlin1/library-tests/reflection/reflection.expected index 7ce456cdcbb2..3bc2f9ce67d6 100644 --- a/java/ql/test-kotlin1/library-tests/reflection/reflection.expected +++ b/java/ql/test-kotlin1/library-tests/reflection/reflection.expected @@ -289,6 +289,7 @@ compGenerated | file:///LongProgression.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | | file:///LongRange.class:0:0:0:0 | forEach | Forwarder for a Kotlin class inheriting an interface default method | | file:///LongRange.class:0:0:0:0 | spliterator | Forwarder for a Kotlin class inheriting an interface default method | +| file:///String.class:0:0:0:0 | getChars | Forwarder for a Kotlin class inheriting an interface default method | | file:///String.class:0:0:0:0 | isEmpty | Forwarder for a Kotlin class inheriting an interface default method | | reflection.kt:7:49:7:54 | new Function2(...) { ... } | The class around a local function, a lambda, or a function reference | | reflection.kt:10:38:10:42 | new KProperty1(...) { ... } | The class around a local function, a lambda, or a function reference | diff --git a/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.expected b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.expected index 03e86e2d2a18..2495c1fc1572 100644 --- a/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.expected +++ b/java/ql/test-kotlin2/library-tests/java-kotlin-collection-type-generic-methods/test.expected @@ -16,30 +16,6 @@ methodWithDuplicate | AbstractCollection | removeAll | Collection | | AbstractCollection | retainAll | Collection | | AbstractCollection | toArray | T[] | -| AbstractCollection> | add | Entry | -| AbstractCollection> | addAll | Collection> | -| AbstractCollection> | contains | Object | -| AbstractCollection> | containsAll | Collection | -| AbstractCollection> | remove | Object | -| AbstractCollection> | removeAll | Collection | -| AbstractCollection> | retainAll | Collection | -| AbstractCollection> | toArray | T[] | -| AbstractCollection | add | K | -| AbstractCollection | addAll | Collection | -| AbstractCollection | contains | Object | -| AbstractCollection | containsAll | Collection | -| AbstractCollection | remove | Object | -| AbstractCollection | removeAll | Collection | -| AbstractCollection | retainAll | Collection | -| AbstractCollection | toArray | T[] | -| AbstractCollection | add | Runnable | -| AbstractCollection | addAll | Collection | -| AbstractCollection | contains | Object | -| AbstractCollection | containsAll | Collection | -| AbstractCollection | remove | Object | -| AbstractCollection | removeAll | Collection | -| AbstractCollection | retainAll | Collection | -| AbstractCollection | toArray | T[] | | AbstractCollection | add | String | | AbstractCollection | addAll | Collection | | AbstractCollection | contains | Object | @@ -56,14 +32,6 @@ methodWithDuplicate | AbstractCollection | removeAll | Collection | | AbstractCollection | retainAll | Collection | | AbstractCollection | toArray | T[] | -| AbstractCollection | add | V | -| AbstractCollection | addAll | Collection | -| AbstractCollection | contains | Object | -| AbstractCollection | containsAll | Collection | -| AbstractCollection | remove | Object | -| AbstractCollection | removeAll | Collection | -| AbstractCollection | retainAll | Collection | -| AbstractCollection | toArray | T[] | | AbstractList | add | E | | AbstractList | add | int | | AbstractList | addAll | Collection | @@ -103,14 +71,14 @@ methodWithDuplicate | AbstractMap | put | V | | AbstractMap | putAll | Map | | AbstractMap | remove | Object | -| AbstractMap> | containsKey | Object | -| AbstractMap> | containsValue | Object | -| AbstractMap> | equals | Object | -| AbstractMap> | get | Object | -| AbstractMap> | put | Entry | -| AbstractMap> | put | Identity | -| AbstractMap> | putAll | Map> | -| AbstractMap> | remove | Object | +| AbstractMap | containsKey | Object | +| AbstractMap | containsValue | Object | +| AbstractMap | equals | Object | +| AbstractMap | get | Object | +| AbstractMap | put | Identity | +| AbstractMap | put | Object | +| AbstractMap | putAll | Map | +| AbstractMap | remove | Object | | AbstractMap | containsKey | Object | | AbstractMap | containsValue | Object | | AbstractMap | equals | Object | @@ -176,16 +144,6 @@ methodWithDuplicate | Collection | retainAll | Collection | | Collection | toArray | IntFunction | | Collection | toArray | T[] | -| Collection | add | Runnable | -| Collection | addAll | Collection | -| Collection | contains | Object | -| Collection | containsAll | Collection | -| Collection | remove | Object | -| Collection | removeAll | Collection | -| Collection | removeIf | Predicate | -| Collection | retainAll | Collection | -| Collection | toArray | IntFunction | -| Collection | toArray | T[] | | Collection | add | String | | Collection | addAll | Collection | | Collection | contains | Object | @@ -325,36 +283,35 @@ methodWithDuplicate | Map | replace | K | | Map | replace | V | | Map | replaceAll | BiFunction | -| Map> | compute | BiFunction,? extends Entry> | -| Map> | compute | Identity | -| Map> | computeIfAbsent | Function> | -| Map> | computeIfAbsent | Identity | -| Map> | computeIfPresent | BiFunction,? extends Entry> | -| Map> | computeIfPresent | Identity | -| Map> | containsKey | Object | -| Map> | containsValue | Object | -| Map> | copyOf | Map | -| Map> | entry | K | -| Map> | entry | V | -| Map> | forEach | BiConsumer> | -| Map> | get | Object | -| Map> | getOrDefault | Entry | -| Map> | getOrDefault | Object | -| Map> | merge | BiFunction,? super Entry,? extends Entry> | -| Map> | merge | Entry | -| Map> | merge | Identity | -| Map> | of | K | -| Map> | of | V | -| Map> | ofEntries | Entry[] | -| Map> | put | Entry | -| Map> | put | Identity | -| Map> | putAll | Map> | -| Map> | putIfAbsent | Entry | -| Map> | putIfAbsent | Identity | -| Map> | remove | Object | -| Map> | replace | Entry | -| Map> | replace | Identity | -| Map> | replaceAll | BiFunction,? extends Entry> | +| Map | compute | BiFunction | +| Map | compute | Identity | +| Map | computeIfAbsent | Function | +| Map | computeIfAbsent | Identity | +| Map | computeIfPresent | BiFunction | +| Map | computeIfPresent | Identity | +| Map | containsKey | Object | +| Map | containsValue | Object | +| Map | copyOf | Map | +| Map | entry | K | +| Map | entry | V | +| Map | forEach | BiConsumer | +| Map | get | Object | +| Map | getOrDefault | Object | +| Map | merge | BiFunction | +| Map | merge | Identity | +| Map | merge | Object | +| Map | of | K | +| Map | of | V | +| Map | ofEntries | Entry[] | +| Map | put | Identity | +| Map | put | Object | +| Map | putAll | Map | +| Map | putIfAbsent | Identity | +| Map | putIfAbsent | Object | +| Map | remove | Object | +| Map | replace | Identity | +| Map | replace | Object | +| Map | replaceAll | BiFunction | | Map | compute | BiFunction | | Map | compute | K | | Map | computeIfAbsent | Function | diff --git a/java/ql/test-kotlin2/library-tests/reflection/reflection.expected b/java/ql/test-kotlin2/library-tests/reflection/reflection.expected index 4074866da65f..b5de2b1adea3 100644 --- a/java/ql/test-kotlin2/library-tests/reflection/reflection.expected +++ b/java/ql/test-kotlin2/library-tests/reflection/reflection.expected @@ -329,6 +329,7 @@ compGenerated | file:///SignStyle.class:0:0:0:0 | getEntries | Default property accessor | | file:///StackWalker$ExtendedOption.class:0:0:0:0 | getEntries | Default property accessor | | file:///StackWalker$Option.class:0:0:0:0 | getEntries | Default property accessor | +| file:///String.class:0:0:0:0 | getChars | Forwarder for a Kotlin class inheriting an interface default method | | file:///String.class:0:0:0:0 | isEmpty | Forwarder for a Kotlin class inheriting an interface default method | | file:///TextStyle.class:0:0:0:0 | getEntries | Default property accessor | | file:///Thread$State.class:0:0:0:0 | getEntries | Default property accessor | diff --git a/java/ql/test/library-tests/compact-source-files/CompactSourceAnalysis.expected b/java/ql/test/library-tests/compact-source-files/CompactSourceAnalysis.expected new file mode 100644 index 000000000000..05db00aa26de --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/CompactSourceAnalysis.expected @@ -0,0 +1 @@ +| Test.java:0:0:0:0 | Test | Test.java:1:1:1:1 | Test | Compact source file 'Test' contains implicit class 'Test' | diff --git a/java/ql/test/library-tests/compact-source-files/CompactSourceAnalysis.ql b/java/ql/test/library-tests/compact-source-files/CompactSourceAnalysis.ql new file mode 100644 index 000000000000..ae6700f64cd2 --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/CompactSourceAnalysis.ql @@ -0,0 +1,9 @@ +import java + +from CompilationUnit cu, Class c +where + cu.isCompactSourceFile() and + c.getCompilationUnit() = cu and + c.isImplicit() +select cu, c, + "Compact source file '" + cu.getName() + "' contains implicit class '" + c.getName() + "'" diff --git a/java/ql/test/library-tests/compact-source-files/CompactSourceDetection.expected b/java/ql/test/library-tests/compact-source-files/CompactSourceDetection.expected new file mode 100644 index 000000000000..0aebdddfb877 --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/CompactSourceDetection.expected @@ -0,0 +1 @@ +| Test.java:0:0:0:0 | Test | diff --git a/java/ql/test/library-tests/compact-source-files/CompactSourceDetection.ql b/java/ql/test/library-tests/compact-source-files/CompactSourceDetection.ql new file mode 100644 index 000000000000..3cf2633c8970 --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/CompactSourceDetection.ql @@ -0,0 +1,5 @@ +import java + +from CompilationUnit cu +where cu.isCompactSourceFile() +select cu diff --git a/java/ql/test/library-tests/compact-source-files/ImplicitClassDetection.expected b/java/ql/test/library-tests/compact-source-files/ImplicitClassDetection.expected new file mode 100644 index 000000000000..61dcdd8a17ff --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/ImplicitClassDetection.expected @@ -0,0 +1,2 @@ +| Test.java:1:1:1:1 | Test | implicit | +| Test.java:25:7:25:16 | NotCompact | not implicit | diff --git a/java/ql/test/library-tests/compact-source-files/ImplicitClassDetection.ql b/java/ql/test/library-tests/compact-source-files/ImplicitClassDetection.ql new file mode 100644 index 000000000000..f1c6b4a27c73 --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/ImplicitClassDetection.ql @@ -0,0 +1,7 @@ +import java + +from Class c, string res +where + exists(c.getCompilationUnit().getRelativePath()) and + if c.isImplicit() then res = "implicit" else res = "not implicit" +select c, res diff --git a/java/ql/test/library-tests/compact-source-files/MethodInCompactSource.expected b/java/ql/test/library-tests/compact-source-files/MethodInCompactSource.expected new file mode 100644 index 000000000000..3c7b45f500ee --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/MethodInCompactSource.expected @@ -0,0 +1,7 @@ +| Test.java:1:1:1:1 | | in compact source | +| Test.java:1:1:1:1 | | in compact source | +| Test.java:5:6:5:9 | main | in compact source | +| Test.java:11:6:11:16 | processData | in compact source | +| Test.java:16:14:16:31 | updatePrivateField | in compact source | +| Test.java:21:13:21:28 | testStaticAccess | in compact source | +| Test.java:27:10:27:25 | methodNotCompact | NOT in compact source | diff --git a/java/ql/test/library-tests/compact-source-files/MethodInCompactSource.ql b/java/ql/test/library-tests/compact-source-files/MethodInCompactSource.ql new file mode 100644 index 000000000000..c5e5bbc80e0d --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/MethodInCompactSource.ql @@ -0,0 +1,8 @@ +import java + +from Method m, Class c, string res +where + c = m.getDeclaringType() and + exists(c.getCompilationUnit().getRelativePath()) and + if c.isImplicit() then res = "in compact source" else res = "NOT in compact source" +select m, res diff --git a/java/ql/test/library-tests/compact-source-files/PrintAst.expected b/java/ql/test/library-tests/compact-source-files/PrintAst.expected new file mode 100644 index 000000000000..7f39470ff0cb --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/PrintAst.expected @@ -0,0 +1,45 @@ +Test.java: +# 0| [CompilationUnit] Test +# 1| 1: [Class] Test +# 1| 4: [FieldDeclaration] int instanceField; +# 1| -1: [TypeAccess] int +# 1| 0: [IntegerLiteral] 10 +# 2| 5: [FieldDeclaration] int STATIC_CONSTANT; +# 2| -1: [TypeAccess] int +# 2| 0: [IntegerLiteral] 42 +# 3| 6: [FieldDeclaration] String privateField; +# 3| -1: [TypeAccess] String +# 3| 0: [StringLiteral] "data" +# 5| 7: [Method] main +# 5| 3: [TypeAccess] void +# 5| 5: [BlockStmt] { ... } +# 6| 0: [ExprStmt] ; +# 6| 0: [MethodCall] processData(...) +# 7| 1: [ExprStmt] ; +# 7| 0: [MethodCall] testStaticAccess(...) +# 11| 8: [Method] processData +# 11| 3: [TypeAccess] void +# 11| 5: [BlockStmt] { ... } +# 12| 0: [ExprStmt] ; +# 12| 0: [PostIncExpr] ...++ +# 12| 0: [VarAccess] instanceField +# 13| 1: [ExprStmt] ; +# 13| 0: [MethodCall] updatePrivateField(...) +# 16| 9: [Method] updatePrivateField +# 16| 3: [TypeAccess] void +# 16| 5: [BlockStmt] { ... } +# 17| 0: [ExprStmt] ; +# 17| 0: [AssignExpr] ...=... +# 17| 0: [VarAccess] privateField +# 17| 1: [StringLiteral] "updated" +# 21| 10: [Method] testStaticAccess +# 21| 3: [TypeAccess] void +# 21| 5: [BlockStmt] { ... } +# 22| 0: [ExprStmt] ; +# 22| 0: [MethodCall] println(...) +# 22| -1: [TypeAccess] IO +# 22| 0: [StringLiteral] "Static access test" +# 25| 11: [Class] NotCompact +# 27| 2: [Method] methodNotCompact +# 27| 3: [TypeAccess] void +# 27| 5: [BlockStmt] { ... } diff --git a/java/ql/test/library-tests/compact-source-files/PrintAst.qlref b/java/ql/test/library-tests/compact-source-files/PrintAst.qlref new file mode 100644 index 000000000000..f391eb5e4636 --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql diff --git a/java/ql/test/library-tests/compact-source-files/Test.java b/java/ql/test/library-tests/compact-source-files/Test.java new file mode 100644 index 000000000000..6159073c2160 --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/Test.java @@ -0,0 +1,29 @@ +int instanceField = 10; +static final int STATIC_CONSTANT = 42; +private String privateField = "data"; + +void main() { + processData(); + testStaticAccess(); +} + +// Test instance methods +void processData() { + instanceField++; + updatePrivateField(); +} + +private void updatePrivateField() { + privateField = "updated"; +} + +// Test static method access +static void testStaticAccess() { + IO.println("Static access test"); +} + +class NotCompact { +//Test explict class + void methodNotCompact() { + } +} \ No newline at end of file diff --git a/java/ql/test/library-tests/compact-source-files/options b/java/ql/test/library-tests/compact-source-files/options new file mode 100644 index 000000000000..db1dc01e53b7 --- /dev/null +++ b/java/ql/test/library-tests/compact-source-files/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args --release 25 --enable-preview diff --git a/java/ql/test/library-tests/dataflow/kdf/KDFDataflowTest.java b/java/ql/test/library-tests/dataflow/kdf/KDFDataflowTest.java new file mode 100644 index 000000000000..460cb2b309fd --- /dev/null +++ b/java/ql/test/library-tests/dataflow/kdf/KDFDataflowTest.java @@ -0,0 +1,87 @@ +import javax.crypto.KDF; +import javax.crypto.spec.HKDFParameterSpec; + +public class KDFDataflowTest { + public static String source(String label) { + return "tainted"; + } + + public static void sink(Object o) {} + + public static void main(String[] args) throws Exception { + String userInput = source(""); + byte[] taintedBytes = userInput.getBytes(); + + testBuilderPattern(taintedBytes); + testSeparateBuilder(taintedBytes); + testKDFWithSalt(taintedBytes); + testStaticParameterSpec(taintedBytes); + testCleanUsage(); + } + + public static void testBuilderPattern(byte[] taintedIKM) throws Exception { + HKDFParameterSpec.Builder builder = HKDFParameterSpec.ofExtract(); + builder.addIKM(taintedIKM); + HKDFParameterSpec spec = builder.thenExpand("info".getBytes(), 32); + + KDF kdf = KDF.getInstance("HKDF-SHA256"); + byte[] result = kdf.deriveData(spec); + sink(result); // $ hasTaintFlow + } + + public static void testSeparateBuilder(byte[] taintedIKM) throws Exception { + HKDFParameterSpec.Builder builder1 = HKDFParameterSpec.ofExtract(); + HKDFParameterSpec.Builder builder2 = builder1.addIKM(taintedIKM); + HKDFParameterSpec spec = builder2.thenExpand("info".getBytes(), 32); + + KDF kdf = KDF.getInstance("HKDF-SHA256"); + byte[] result = kdf.deriveData(spec); + sink(result); // $ hasTaintFlow + } + + public static void testKDFWithSalt(byte[] taintedIKM) throws Exception { + HKDFParameterSpec.Builder builder = HKDFParameterSpec.ofExtract(); + builder.addIKM(taintedIKM); + builder.addSalt("sensitive-salt".getBytes()); + HKDFParameterSpec spec = builder.thenExpand("info".getBytes(), 32); + + KDF kdf = KDF.getInstance("HKDF-SHA256"); + byte[] result = kdf.deriveData(spec); + sink(result); // $ hasTaintFlow + } + + public static void testStaticParameterSpec(byte[] taintedIKM) throws Exception { + javax.crypto.spec.SecretKeySpec secretKey = new javax.crypto.spec.SecretKeySpec(taintedIKM, "AES"); + HKDFParameterSpec spec = HKDFParameterSpec.expandOnly( + secretKey, "info".getBytes(), 32); + + KDF kdf = KDF.getInstance("HKDF-SHA256"); + byte[] result = kdf.deriveData(spec); + sink(result); // $ hasTaintFlow + } + + public static void testCleanUsage() throws Exception { + byte[] cleanKeyMaterial = "static-key-material".getBytes(); + + HKDFParameterSpec.Builder builder = HKDFParameterSpec.ofExtract(); + builder.addIKM(cleanKeyMaterial); + HKDFParameterSpec spec = builder.thenExpand("info".getBytes(), 32); + + KDF kdf = KDF.getInstance("HKDF-SHA256"); + byte[] cleanResult = kdf.deriveData(spec); + sink(cleanResult); // Safe - no taint + } + + public static void testThenExpand(byte[] cleanIKM) throws Exception { + String userInput = source(""); + byte[] taintedInfo = userInput.getBytes(); + + HKDFParameterSpec.Builder builder = HKDFParameterSpec.ofExtract(); + builder.addIKM(cleanIKM); + HKDFParameterSpec spec = builder.thenExpand(taintedInfo, 32); + + KDF kdf = KDF.getInstance("HKDF-SHA256"); + byte[] result = kdf.deriveData(spec); + sink(result); // $ hasTaintFlow + } +} \ No newline at end of file diff --git a/java/ql/test/library-tests/dataflow/kdf/options b/java/ql/test/library-tests/dataflow/kdf/options new file mode 100644 index 000000000000..f4edc64c0178 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/kdf/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args --enable-preview --release 25 \ No newline at end of file diff --git a/java/ql/test/library-tests/dataflow/kdf/test.expected b/java/ql/test/library-tests/dataflow/kdf/test.expected new file mode 100644 index 000000000000..cab9b4bc0546 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/kdf/test.expected @@ -0,0 +1,105 @@ +models +| 1 | Summary: java.lang; String; false; getBytes; ; ; Argument[this]; ReturnValue; taint; manual | +| 2 | Summary: javax.crypto.spec; HKDFParameterSpec$Builder; true; addIKM; (byte[]); ; Argument[0]; Argument[this]; taint; manual | +| 3 | Summary: javax.crypto.spec; HKDFParameterSpec$Builder; true; addIKM; (byte[]); ; Argument[this]; ReturnValue; value; manual | +| 4 | Summary: javax.crypto.spec; HKDFParameterSpec$Builder; true; thenExpand; (byte[],int); ; Argument[0]; ReturnValue; taint; manual | +| 5 | Summary: javax.crypto.spec; HKDFParameterSpec$Builder; true; thenExpand; (byte[],int); ; Argument[this]; ReturnValue; taint; manual | +| 6 | Summary: javax.crypto.spec; HKDFParameterSpec; false; expandOnly; (SecretKey,byte[],int); ; Argument[0]; ReturnValue; taint; manual | +| 7 | Summary: javax.crypto.spec; SecretKeySpec; false; SecretKeySpec; (byte[],String); ; Argument[0]; Argument[this]; taint; manual | +| 8 | Summary: javax.crypto; KDF; true; deriveData; (AlgorithmParameterSpec); ; Argument[0]; ReturnValue; taint; manual | +edges +| KDFDataflowTest.java:12:28:12:37 | source(...) : String | KDFDataflowTest.java:13:31:13:39 | userInput : String | provenance | | +| KDFDataflowTest.java:13:31:13:39 | userInput : String | KDFDataflowTest.java:13:31:13:50 | getBytes(...) : byte[] | provenance | MaD:1 | +| KDFDataflowTest.java:13:31:13:50 | getBytes(...) : byte[] | KDFDataflowTest.java:15:28:15:39 | taintedBytes : byte[] | provenance | | +| KDFDataflowTest.java:13:31:13:50 | getBytes(...) : byte[] | KDFDataflowTest.java:16:29:16:40 | taintedBytes : byte[] | provenance | | +| KDFDataflowTest.java:13:31:13:50 | getBytes(...) : byte[] | KDFDataflowTest.java:17:25:17:36 | taintedBytes : byte[] | provenance | | +| KDFDataflowTest.java:13:31:13:50 | getBytes(...) : byte[] | KDFDataflowTest.java:18:33:18:44 | taintedBytes : byte[] | provenance | | +| KDFDataflowTest.java:15:28:15:39 | taintedBytes : byte[] | KDFDataflowTest.java:22:43:22:59 | taintedIKM : byte[] | provenance | | +| KDFDataflowTest.java:16:29:16:40 | taintedBytes : byte[] | KDFDataflowTest.java:32:44:32:60 | taintedIKM : byte[] | provenance | | +| KDFDataflowTest.java:17:25:17:36 | taintedBytes : byte[] | KDFDataflowTest.java:42:40:42:56 | taintedIKM : byte[] | provenance | | +| KDFDataflowTest.java:18:33:18:44 | taintedBytes : byte[] | KDFDataflowTest.java:53:48:53:64 | taintedIKM : byte[] | provenance | | +| KDFDataflowTest.java:22:43:22:59 | taintedIKM : byte[] | KDFDataflowTest.java:24:24:24:33 | taintedIKM : byte[] | provenance | | +| KDFDataflowTest.java:24:9:24:15 | builder [post update] : Builder | KDFDataflowTest.java:25:34:25:40 | builder : Builder | provenance | | +| KDFDataflowTest.java:24:24:24:33 | taintedIKM : byte[] | KDFDataflowTest.java:24:9:24:15 | builder [post update] : Builder | provenance | MaD:2 | +| KDFDataflowTest.java:25:34:25:40 | builder : Builder | KDFDataflowTest.java:25:34:25:74 | thenExpand(...) : ExtractThenExpand | provenance | MaD:5 | +| KDFDataflowTest.java:25:34:25:74 | thenExpand(...) : ExtractThenExpand | KDFDataflowTest.java:28:40:28:43 | spec : ExtractThenExpand | provenance | | +| KDFDataflowTest.java:28:25:28:44 | deriveData(...) : byte[] | KDFDataflowTest.java:29:14:29:19 | result | provenance | | +| KDFDataflowTest.java:28:40:28:43 | spec : ExtractThenExpand | KDFDataflowTest.java:28:25:28:44 | deriveData(...) : byte[] | provenance | MaD:8 | +| KDFDataflowTest.java:32:44:32:60 | taintedIKM : byte[] | KDFDataflowTest.java:34:62:34:71 | taintedIKM : byte[] | provenance | | +| KDFDataflowTest.java:34:46:34:72 | addIKM(...) : Builder | KDFDataflowTest.java:35:34:35:41 | builder2 : Builder | provenance | | +| KDFDataflowTest.java:34:62:34:71 | taintedIKM : byte[] | KDFDataflowTest.java:34:46:34:72 | addIKM(...) : Builder | provenance | MaD:2+MaD:3 | +| KDFDataflowTest.java:35:34:35:41 | builder2 : Builder | KDFDataflowTest.java:35:34:35:75 | thenExpand(...) : ExtractThenExpand | provenance | MaD:5 | +| KDFDataflowTest.java:35:34:35:75 | thenExpand(...) : ExtractThenExpand | KDFDataflowTest.java:38:40:38:43 | spec : ExtractThenExpand | provenance | | +| KDFDataflowTest.java:38:25:38:44 | deriveData(...) : byte[] | KDFDataflowTest.java:39:14:39:19 | result | provenance | | +| KDFDataflowTest.java:38:40:38:43 | spec : ExtractThenExpand | KDFDataflowTest.java:38:25:38:44 | deriveData(...) : byte[] | provenance | MaD:8 | +| KDFDataflowTest.java:42:40:42:56 | taintedIKM : byte[] | KDFDataflowTest.java:44:24:44:33 | taintedIKM : byte[] | provenance | | +| KDFDataflowTest.java:44:9:44:15 | builder [post update] : Builder | KDFDataflowTest.java:46:34:46:40 | builder : Builder | provenance | | +| KDFDataflowTest.java:44:24:44:33 | taintedIKM : byte[] | KDFDataflowTest.java:44:9:44:15 | builder [post update] : Builder | provenance | MaD:2 | +| KDFDataflowTest.java:46:34:46:40 | builder : Builder | KDFDataflowTest.java:46:34:46:74 | thenExpand(...) : ExtractThenExpand | provenance | MaD:5 | +| KDFDataflowTest.java:46:34:46:74 | thenExpand(...) : ExtractThenExpand | KDFDataflowTest.java:49:40:49:43 | spec : ExtractThenExpand | provenance | | +| KDFDataflowTest.java:49:25:49:44 | deriveData(...) : byte[] | KDFDataflowTest.java:50:14:50:19 | result | provenance | | +| KDFDataflowTest.java:49:40:49:43 | spec : ExtractThenExpand | KDFDataflowTest.java:49:25:49:44 | deriveData(...) : byte[] | provenance | MaD:8 | +| KDFDataflowTest.java:53:48:53:64 | taintedIKM : byte[] | KDFDataflowTest.java:54:89:54:98 | taintedIKM : byte[] | provenance | | +| KDFDataflowTest.java:54:53:54:106 | new SecretKeySpec(...) : SecretKeySpec | KDFDataflowTest.java:56:13:56:21 | secretKey : SecretKeySpec | provenance | | +| KDFDataflowTest.java:54:89:54:98 | taintedIKM : byte[] | KDFDataflowTest.java:54:53:54:106 | new SecretKeySpec(...) : SecretKeySpec | provenance | MaD:7 | +| KDFDataflowTest.java:55:34:56:45 | expandOnly(...) : Expand | KDFDataflowTest.java:59:40:59:43 | spec : Expand | provenance | | +| KDFDataflowTest.java:56:13:56:21 | secretKey : SecretKeySpec | KDFDataflowTest.java:55:34:56:45 | expandOnly(...) : Expand | provenance | MaD:6 | +| KDFDataflowTest.java:59:25:59:44 | deriveData(...) : byte[] | KDFDataflowTest.java:60:14:60:19 | result | provenance | | +| KDFDataflowTest.java:59:40:59:43 | spec : Expand | KDFDataflowTest.java:59:25:59:44 | deriveData(...) : byte[] | provenance | MaD:8 | +| KDFDataflowTest.java:76:28:76:37 | source(...) : String | KDFDataflowTest.java:77:30:77:38 | userInput : String | provenance | | +| KDFDataflowTest.java:77:30:77:38 | userInput : String | KDFDataflowTest.java:77:30:77:49 | getBytes(...) : byte[] | provenance | MaD:1 | +| KDFDataflowTest.java:77:30:77:49 | getBytes(...) : byte[] | KDFDataflowTest.java:81:53:81:63 | taintedInfo : byte[] | provenance | | +| KDFDataflowTest.java:81:34:81:68 | thenExpand(...) : ExtractThenExpand | KDFDataflowTest.java:84:40:84:43 | spec : ExtractThenExpand | provenance | | +| KDFDataflowTest.java:81:53:81:63 | taintedInfo : byte[] | KDFDataflowTest.java:81:34:81:68 | thenExpand(...) : ExtractThenExpand | provenance | MaD:4 | +| KDFDataflowTest.java:84:25:84:44 | deriveData(...) : byte[] | KDFDataflowTest.java:85:14:85:19 | result | provenance | | +| KDFDataflowTest.java:84:40:84:43 | spec : ExtractThenExpand | KDFDataflowTest.java:84:25:84:44 | deriveData(...) : byte[] | provenance | MaD:8 | +nodes +| KDFDataflowTest.java:12:28:12:37 | source(...) : String | semmle.label | source(...) : String | +| KDFDataflowTest.java:13:31:13:39 | userInput : String | semmle.label | userInput : String | +| KDFDataflowTest.java:13:31:13:50 | getBytes(...) : byte[] | semmle.label | getBytes(...) : byte[] | +| KDFDataflowTest.java:15:28:15:39 | taintedBytes : byte[] | semmle.label | taintedBytes : byte[] | +| KDFDataflowTest.java:16:29:16:40 | taintedBytes : byte[] | semmle.label | taintedBytes : byte[] | +| KDFDataflowTest.java:17:25:17:36 | taintedBytes : byte[] | semmle.label | taintedBytes : byte[] | +| KDFDataflowTest.java:18:33:18:44 | taintedBytes : byte[] | semmle.label | taintedBytes : byte[] | +| KDFDataflowTest.java:22:43:22:59 | taintedIKM : byte[] | semmle.label | taintedIKM : byte[] | +| KDFDataflowTest.java:24:9:24:15 | builder [post update] : Builder | semmle.label | builder [post update] : Builder | +| KDFDataflowTest.java:24:24:24:33 | taintedIKM : byte[] | semmle.label | taintedIKM : byte[] | +| KDFDataflowTest.java:25:34:25:40 | builder : Builder | semmle.label | builder : Builder | +| KDFDataflowTest.java:25:34:25:74 | thenExpand(...) : ExtractThenExpand | semmle.label | thenExpand(...) : ExtractThenExpand | +| KDFDataflowTest.java:28:25:28:44 | deriveData(...) : byte[] | semmle.label | deriveData(...) : byte[] | +| KDFDataflowTest.java:28:40:28:43 | spec : ExtractThenExpand | semmle.label | spec : ExtractThenExpand | +| KDFDataflowTest.java:29:14:29:19 | result | semmle.label | result | +| KDFDataflowTest.java:32:44:32:60 | taintedIKM : byte[] | semmle.label | taintedIKM : byte[] | +| KDFDataflowTest.java:34:46:34:72 | addIKM(...) : Builder | semmle.label | addIKM(...) : Builder | +| KDFDataflowTest.java:34:62:34:71 | taintedIKM : byte[] | semmle.label | taintedIKM : byte[] | +| KDFDataflowTest.java:35:34:35:41 | builder2 : Builder | semmle.label | builder2 : Builder | +| KDFDataflowTest.java:35:34:35:75 | thenExpand(...) : ExtractThenExpand | semmle.label | thenExpand(...) : ExtractThenExpand | +| KDFDataflowTest.java:38:25:38:44 | deriveData(...) : byte[] | semmle.label | deriveData(...) : byte[] | +| KDFDataflowTest.java:38:40:38:43 | spec : ExtractThenExpand | semmle.label | spec : ExtractThenExpand | +| KDFDataflowTest.java:39:14:39:19 | result | semmle.label | result | +| KDFDataflowTest.java:42:40:42:56 | taintedIKM : byte[] | semmle.label | taintedIKM : byte[] | +| KDFDataflowTest.java:44:9:44:15 | builder [post update] : Builder | semmle.label | builder [post update] : Builder | +| KDFDataflowTest.java:44:24:44:33 | taintedIKM : byte[] | semmle.label | taintedIKM : byte[] | +| KDFDataflowTest.java:46:34:46:40 | builder : Builder | semmle.label | builder : Builder | +| KDFDataflowTest.java:46:34:46:74 | thenExpand(...) : ExtractThenExpand | semmle.label | thenExpand(...) : ExtractThenExpand | +| KDFDataflowTest.java:49:25:49:44 | deriveData(...) : byte[] | semmle.label | deriveData(...) : byte[] | +| KDFDataflowTest.java:49:40:49:43 | spec : ExtractThenExpand | semmle.label | spec : ExtractThenExpand | +| KDFDataflowTest.java:50:14:50:19 | result | semmle.label | result | +| KDFDataflowTest.java:53:48:53:64 | taintedIKM : byte[] | semmle.label | taintedIKM : byte[] | +| KDFDataflowTest.java:54:53:54:106 | new SecretKeySpec(...) : SecretKeySpec | semmle.label | new SecretKeySpec(...) : SecretKeySpec | +| KDFDataflowTest.java:54:89:54:98 | taintedIKM : byte[] | semmle.label | taintedIKM : byte[] | +| KDFDataflowTest.java:55:34:56:45 | expandOnly(...) : Expand | semmle.label | expandOnly(...) : Expand | +| KDFDataflowTest.java:56:13:56:21 | secretKey : SecretKeySpec | semmle.label | secretKey : SecretKeySpec | +| KDFDataflowTest.java:59:25:59:44 | deriveData(...) : byte[] | semmle.label | deriveData(...) : byte[] | +| KDFDataflowTest.java:59:40:59:43 | spec : Expand | semmle.label | spec : Expand | +| KDFDataflowTest.java:60:14:60:19 | result | semmle.label | result | +| KDFDataflowTest.java:76:28:76:37 | source(...) : String | semmle.label | source(...) : String | +| KDFDataflowTest.java:77:30:77:38 | userInput : String | semmle.label | userInput : String | +| KDFDataflowTest.java:77:30:77:49 | getBytes(...) : byte[] | semmle.label | getBytes(...) : byte[] | +| KDFDataflowTest.java:81:34:81:68 | thenExpand(...) : ExtractThenExpand | semmle.label | thenExpand(...) : ExtractThenExpand | +| KDFDataflowTest.java:81:53:81:63 | taintedInfo : byte[] | semmle.label | taintedInfo : byte[] | +| KDFDataflowTest.java:84:25:84:44 | deriveData(...) : byte[] | semmle.label | deriveData(...) : byte[] | +| KDFDataflowTest.java:84:40:84:43 | spec : ExtractThenExpand | semmle.label | spec : ExtractThenExpand | +| KDFDataflowTest.java:85:14:85:19 | result | semmle.label | result | +subpaths +testFailures diff --git a/java/ql/test/library-tests/dataflow/kdf/test.ql b/java/ql/test/library-tests/dataflow/kdf/test.ql new file mode 100644 index 000000000000..b2ffe7d9a679 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/kdf/test.ql @@ -0,0 +1,3 @@ +import utils.test.InlineFlowTest +import TaintFlowTest +import TaintFlow::PathGraph diff --git a/java/ql/test/library-tests/dataflow/scoped-values/ScopedValueFlowTest.java b/java/ql/test/library-tests/dataflow/scoped-values/ScopedValueFlowTest.java new file mode 100644 index 000000000000..2df07ae2f32c --- /dev/null +++ b/java/ql/test/library-tests/dataflow/scoped-values/ScopedValueFlowTest.java @@ -0,0 +1,44 @@ +import java.lang.ScopedValue; + +public class ScopedValueFlowTest { + private static final ScopedValue USER_CONTEXT = ScopedValue.newInstance(); + private static final ScopedValue SESSION_ID = ScopedValue.newInstance(); + + public static String source(String label) { + return "tainted"; + } + + public static void sink(String value) {} + + public static void main(String[] args) { + String userInput = source(""); + + // Test 1: Basic scoped value binding and retrieval + ScopedValue.where(USER_CONTEXT, userInput) + .run(() -> { + String value = USER_CONTEXT.get(); + sink(value); // $ hasTaintFlow + }); + + // Test 2: Multiple scoped value bindings with chaining + ScopedValue.where(USER_CONTEXT, userInput) + .where(SESSION_ID, "safe-one") + .run(() -> { + String user = USER_CONTEXT.get(); + String session = SESSION_ID.get(); + sink(user); // $ hasTaintFlow + sink(session); // safe - should NOT have taint flow + }); + + ScopedValue.where(USER_CONTEXT, userInput) + .run(() -> { + String outer = USER_CONTEXT.get(); + ScopedValue.where(USER_CONTEXT, "safe-two") + .run(() -> { + String inner = USER_CONTEXT.get(); + sink(inner); // $ SPURIOUS: hasTaintFlow + }); + sink(outer); // $ hasTaintFlow + }); + } +} \ No newline at end of file diff --git a/java/ql/test/library-tests/dataflow/scoped-values/options b/java/ql/test/library-tests/dataflow/scoped-values/options new file mode 100644 index 000000000000..c793109355a5 --- /dev/null +++ b/java/ql/test/library-tests/dataflow/scoped-values/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args -source 25 -target 25 --enable-preview \ No newline at end of file diff --git a/java/ql/test/library-tests/dataflow/scoped-values/test.expected b/java/ql/test/library-tests/dataflow/scoped-values/test.expected new file mode 100644 index 000000000000..a617a94188ee --- /dev/null +++ b/java/ql/test/library-tests/dataflow/scoped-values/test.expected @@ -0,0 +1,48 @@ +models +| 1 | Summary: java.lang; ScopedValue; false; where; (ScopedValue,Object); ; Argument[1]; Argument[0].SyntheticField[java.lang.ScopedValue.boundValue]; value; manual | +| 2 | Summary: java.lang; ScopedValue; true; get; (); ; Argument[this].SyntheticField[java.lang.ScopedValue.boundValue]; ReturnValue; value; manual | +edges +| ScopedValueFlowTest.java:4:46:4:57 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:19:32:19:43 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | | +| ScopedValueFlowTest.java:4:46:4:57 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:27:31:27:42 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | | +| ScopedValueFlowTest.java:4:46:4:57 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:35:32:35:43 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | | +| ScopedValueFlowTest.java:4:46:4:57 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:38:40:38:51 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | | +| ScopedValueFlowTest.java:14:28:14:37 | source(...) : String | ScopedValueFlowTest.java:17:41:17:49 | userInput : String | provenance | | +| ScopedValueFlowTest.java:14:28:14:37 | source(...) : String | ScopedValueFlowTest.java:24:41:24:49 | userInput : String | provenance | | +| ScopedValueFlowTest.java:14:28:14:37 | source(...) : String | ScopedValueFlowTest.java:33:41:33:49 | userInput : String | provenance | | +| ScopedValueFlowTest.java:17:27:17:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:4:46:4:57 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | | +| ScopedValueFlowTest.java:17:41:17:49 | userInput : String | ScopedValueFlowTest.java:17:27:17:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | MaD:1 | +| ScopedValueFlowTest.java:19:32:19:43 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:19:32:19:49 | get(...) : String | provenance | MaD:2 | +| ScopedValueFlowTest.java:19:32:19:49 | get(...) : String | ScopedValueFlowTest.java:20:22:20:26 | value | provenance | | +| ScopedValueFlowTest.java:24:27:24:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:4:46:4:57 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | | +| ScopedValueFlowTest.java:24:41:24:49 | userInput : String | ScopedValueFlowTest.java:24:27:24:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | MaD:1 | +| ScopedValueFlowTest.java:27:31:27:42 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:27:31:27:48 | get(...) : String | provenance | MaD:2 | +| ScopedValueFlowTest.java:27:31:27:48 | get(...) : String | ScopedValueFlowTest.java:29:22:29:25 | user | provenance | | +| ScopedValueFlowTest.java:33:27:33:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:4:46:4:57 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | | +| ScopedValueFlowTest.java:33:41:33:49 | userInput : String | ScopedValueFlowTest.java:33:27:33:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | provenance | MaD:1 | +| ScopedValueFlowTest.java:35:32:35:43 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:35:32:35:49 | get(...) : String | provenance | MaD:2 | +| ScopedValueFlowTest.java:35:32:35:49 | get(...) : String | ScopedValueFlowTest.java:41:22:41:26 | outer | provenance | | +| ScopedValueFlowTest.java:38:40:38:51 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | ScopedValueFlowTest.java:38:40:38:57 | get(...) : String | provenance | MaD:2 | +| ScopedValueFlowTest.java:38:40:38:57 | get(...) : String | ScopedValueFlowTest.java:39:30:39:34 | inner | provenance | | +nodes +| ScopedValueFlowTest.java:4:46:4:57 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | semmle.label | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | +| ScopedValueFlowTest.java:14:28:14:37 | source(...) : String | semmle.label | source(...) : String | +| ScopedValueFlowTest.java:17:27:17:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | semmle.label | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | +| ScopedValueFlowTest.java:17:41:17:49 | userInput : String | semmle.label | userInput : String | +| ScopedValueFlowTest.java:19:32:19:43 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | semmle.label | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | +| ScopedValueFlowTest.java:19:32:19:49 | get(...) : String | semmle.label | get(...) : String | +| ScopedValueFlowTest.java:20:22:20:26 | value | semmle.label | value | +| ScopedValueFlowTest.java:24:27:24:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | semmle.label | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | +| ScopedValueFlowTest.java:24:41:24:49 | userInput : String | semmle.label | userInput : String | +| ScopedValueFlowTest.java:27:31:27:42 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | semmle.label | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | +| ScopedValueFlowTest.java:27:31:27:48 | get(...) : String | semmle.label | get(...) : String | +| ScopedValueFlowTest.java:29:22:29:25 | user | semmle.label | user | +| ScopedValueFlowTest.java:33:27:33:38 | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | semmle.label | USER_CONTEXT [post update] : ScopedValue [java.lang.ScopedValue.boundValue] : String | +| ScopedValueFlowTest.java:33:41:33:49 | userInput : String | semmle.label | userInput : String | +| ScopedValueFlowTest.java:35:32:35:43 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | semmle.label | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | +| ScopedValueFlowTest.java:35:32:35:49 | get(...) : String | semmle.label | get(...) : String | +| ScopedValueFlowTest.java:38:40:38:51 | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | semmle.label | USER_CONTEXT : ScopedValue [java.lang.ScopedValue.boundValue] : String | +| ScopedValueFlowTest.java:38:40:38:57 | get(...) : String | semmle.label | get(...) : String | +| ScopedValueFlowTest.java:39:30:39:34 | inner | semmle.label | inner | +| ScopedValueFlowTest.java:41:22:41:26 | outer | semmle.label | outer | +subpaths +testFailures diff --git a/java/ql/test/library-tests/dataflow/scoped-values/test.ql b/java/ql/test/library-tests/dataflow/scoped-values/test.ql new file mode 100644 index 000000000000..14dfc550b73a --- /dev/null +++ b/java/ql/test/library-tests/dataflow/scoped-values/test.ql @@ -0,0 +1,4 @@ +import java +import utils.test.InlineFlowTest +import TaintFlowTest +import TaintFlow::PathGraph diff --git a/java/ql/test/library-tests/flexible-constructors/FlexibleConstructors.java b/java/ql/test/library-tests/flexible-constructors/FlexibleConstructors.java new file mode 100644 index 000000000000..bcd9a26f7b12 --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/FlexibleConstructors.java @@ -0,0 +1,95 @@ +class A { + A(String msg) { + System.out.println("A: " + msg); + } +} + +class B extends A { + B(String input) { + var msg = input.trim().toUpperCase(); + super(msg); + } +} + +class C { + private final int x; + + C(int x) { + if (x < 0) throw new IllegalArgumentException(); + super(); + this.x = x; + } +} + +record R(String name, int score) { + public R(String name) { + var score = name.length(); + this(name, score); + } +} + +class Outer { + private final String prefix = "outer"; + + class Inner { + private String full; + + Inner(String suffix) { + var combined = prefix + "_" + suffix; + super(); + this.full = combined; + } + } +} + +class D { + private final String value; + private final int length; + + D(String input) { + var processed = input.toLowerCase(); + value = processed; + this.length = processed.length(); + super(); + } +} + +class E extends A { + private boolean isValid; + private String processed; + + E(String data) { + var temp = data != null ? data.trim() : ""; + this.processed = temp; + isValid = !temp.isEmpty(); + super(temp); + } +} + +class F { + private int x; + private final int y; + private int sum; + + F(int a, int b) { + x = a; + this.y = b; + this.sum = a + b; + super(); + } +} + +class G { + private String instance_val; + + { + instance_val = "instance"; + } + + G(String input) { + var tmp = input != null ? input : "default"; + var string = tmp + "_initialized"; + super(); + this.instance_val = string; + } +} diff --git a/java/ql/test/library-tests/flexible-constructors/InstanceInitializerCalls.expected b/java/ql/test/library-tests/flexible-constructors/InstanceInitializerCalls.expected new file mode 100644 index 000000000000..75a112fe2082 --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/InstanceInitializerCalls.expected @@ -0,0 +1,2 @@ +| FlexibleConstructors.java:31:7:31:11 | ; | 1 | | Instance initializer call at index 1 | +| FlexibleConstructors.java:89:5:89:5 | ; | 3 | | Instance initializer call at index 3 | diff --git a/java/ql/test/library-tests/flexible-constructors/InstanceInitializerCalls.ql b/java/ql/test/library-tests/flexible-constructors/InstanceInitializerCalls.ql new file mode 100644 index 000000000000..286137fc4524 --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/InstanceInitializerCalls.ql @@ -0,0 +1,8 @@ +import java + +from MethodCall call, Method m +where + call.getMethod() = m and + m.getName() = "" +select call.getEnclosingStmt(), call.getEnclosingStmt().getIndex(), call.getMethod().getName(), + "Instance initializer call at index " + call.getEnclosingStmt().getIndex() diff --git a/java/ql/test/library-tests/flexible-constructors/PrettyPrint.expected b/java/ql/test/library-tests/flexible-constructors/PrettyPrint.expected new file mode 100644 index 000000000000..d90e8b8f831f --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/PrettyPrint.expected @@ -0,0 +1,125 @@ +| FlexibleConstructors.java:1:7:1:7 | A | 0 | class A { | +| FlexibleConstructors.java:1:7:1:7 | A | 1 | A(String msg) { | +| FlexibleConstructors.java:1:7:1:7 | A | 2 | super(); | +| FlexibleConstructors.java:1:7:1:7 | A | 3 | System.out.println("A: " + msg); | +| FlexibleConstructors.java:1:7:1:7 | A | 4 | } | +| FlexibleConstructors.java:1:7:1:7 | A | 5 | } | +| FlexibleConstructors.java:7:7:7:7 | B | 0 | class B { | +| FlexibleConstructors.java:7:7:7:7 | B | 1 | B(String input) { | +| FlexibleConstructors.java:7:7:7:7 | B | 2 | var msg = input.trim().toUpperCase(); | +| FlexibleConstructors.java:7:7:7:7 | B | 3 | super(msg); | +| FlexibleConstructors.java:7:7:7:7 | B | 4 | } | +| FlexibleConstructors.java:7:7:7:7 | B | 5 | } | +| FlexibleConstructors.java:14:7:14:7 | C | 0 | class C { | +| FlexibleConstructors.java:14:7:14:7 | C | 1 | private final int x; | +| FlexibleConstructors.java:14:7:14:7 | C | 2 | | +| FlexibleConstructors.java:14:7:14:7 | C | 3 | C(int x) { | +| FlexibleConstructors.java:14:7:14:7 | C | 4 | if (x < 0) | +| FlexibleConstructors.java:14:7:14:7 | C | 5 | throw new IllegalArgumentException(); | +| FlexibleConstructors.java:14:7:14:7 | C | 6 | super(); | +| FlexibleConstructors.java:14:7:14:7 | C | 7 | this.x = x; | +| FlexibleConstructors.java:14:7:14:7 | C | 8 | } | +| FlexibleConstructors.java:14:7:14:7 | C | 9 | } | +| FlexibleConstructors.java:24:8:24:8 | R | 0 | final class R { | +| FlexibleConstructors.java:24:8:24:8 | R | 1 | public final boolean equals(Object p0) { } | +| FlexibleConstructors.java:24:8:24:8 | R | 2 | | +| FlexibleConstructors.java:24:8:24:8 | R | 3 | public final int hashCode() { } | +| FlexibleConstructors.java:24:8:24:8 | R | 4 | | +| FlexibleConstructors.java:24:8:24:8 | R | 5 | public String name() { } | +| FlexibleConstructors.java:24:8:24:8 | R | 6 | | +| FlexibleConstructors.java:24:8:24:8 | R | 7 | public int score() { } | +| FlexibleConstructors.java:24:8:24:8 | R | 8 | | +| FlexibleConstructors.java:24:8:24:8 | R | 9 | public final String toString() { } | +| FlexibleConstructors.java:24:8:24:8 | R | 10 | | +| FlexibleConstructors.java:24:8:24:8 | R | 11 | R(String name, int score) { | +| FlexibleConstructors.java:24:8:24:8 | R | 12 | super(); | +| FlexibleConstructors.java:24:8:24:8 | R | 13 | this.name = name; | +| FlexibleConstructors.java:24:8:24:8 | R | 14 | this.score = score; | +| FlexibleConstructors.java:24:8:24:8 | R | 15 | } | +| FlexibleConstructors.java:24:8:24:8 | R | 16 | | +| FlexibleConstructors.java:24:8:24:8 | R | 17 | private final String name; | +| FlexibleConstructors.java:24:8:24:8 | R | 18 | | +| FlexibleConstructors.java:24:8:24:8 | R | 19 | private final int score; | +| FlexibleConstructors.java:24:8:24:8 | R | 20 | | +| FlexibleConstructors.java:24:8:24:8 | R | 21 | public R(String name) { | +| FlexibleConstructors.java:24:8:24:8 | R | 22 | var score = name.length(); | +| FlexibleConstructors.java:24:8:24:8 | R | 23 | this(name, score); | +| FlexibleConstructors.java:24:8:24:8 | R | 24 | } | +| FlexibleConstructors.java:24:8:24:8 | R | 25 | } | +| FlexibleConstructors.java:31:7:31:11 | Outer | 0 | class Outer { | +| FlexibleConstructors.java:31:7:31:11 | Outer | 1 | private void () { | +| FlexibleConstructors.java:31:7:31:11 | Outer | 2 | prefix = "outer"; | +| FlexibleConstructors.java:31:7:31:11 | Outer | 3 | } | +| FlexibleConstructors.java:31:7:31:11 | Outer | 4 | | +| FlexibleConstructors.java:31:7:31:11 | Outer | 5 | Outer() { | +| FlexibleConstructors.java:31:7:31:11 | Outer | 6 | super(); | +| FlexibleConstructors.java:31:7:31:11 | Outer | 7 | (); | +| FlexibleConstructors.java:31:7:31:11 | Outer | 8 | } | +| FlexibleConstructors.java:31:7:31:11 | Outer | 9 | | +| FlexibleConstructors.java:31:7:31:11 | Outer | 10 | private final String prefix; | +| FlexibleConstructors.java:31:7:31:11 | Outer | 11 | | +| FlexibleConstructors.java:31:7:31:11 | Outer | 12 | class Inner { | +| FlexibleConstructors.java:31:7:31:11 | Outer | 13 | private String full; | +| FlexibleConstructors.java:31:7:31:11 | Outer | 14 | | +| FlexibleConstructors.java:31:7:31:11 | Outer | 15 | Inner(String suffix) { | +| FlexibleConstructors.java:31:7:31:11 | Outer | 16 | var combined = prefix + "_" + suffix; | +| FlexibleConstructors.java:31:7:31:11 | Outer | 17 | super(); | +| FlexibleConstructors.java:31:7:31:11 | Outer | 18 | this.full = combined; | +| FlexibleConstructors.java:31:7:31:11 | Outer | 19 | } | +| FlexibleConstructors.java:31:7:31:11 | Outer | 20 | } | +| FlexibleConstructors.java:31:7:31:11 | Outer | 21 | } | +| FlexibleConstructors.java:45:7:45:7 | D | 0 | class D { | +| FlexibleConstructors.java:45:7:45:7 | D | 1 | private final String value; | +| FlexibleConstructors.java:45:7:45:7 | D | 2 | | +| FlexibleConstructors.java:45:7:45:7 | D | 3 | private final int length; | +| FlexibleConstructors.java:45:7:45:7 | D | 4 | | +| FlexibleConstructors.java:45:7:45:7 | D | 5 | D(String input) { | +| FlexibleConstructors.java:45:7:45:7 | D | 6 | var processed = input.toLowerCase(); | +| FlexibleConstructors.java:45:7:45:7 | D | 7 | value = processed; | +| FlexibleConstructors.java:45:7:45:7 | D | 8 | this.length = processed.length(); | +| FlexibleConstructors.java:45:7:45:7 | D | 9 | super(); | +| FlexibleConstructors.java:45:7:45:7 | D | 10 | } | +| FlexibleConstructors.java:45:7:45:7 | D | 11 | } | +| FlexibleConstructors.java:57:7:57:7 | E | 0 | class E { | +| FlexibleConstructors.java:57:7:57:7 | E | 1 | private boolean isValid; | +| FlexibleConstructors.java:57:7:57:7 | E | 2 | | +| FlexibleConstructors.java:57:7:57:7 | E | 3 | private String processed; | +| FlexibleConstructors.java:57:7:57:7 | E | 4 | | +| FlexibleConstructors.java:57:7:57:7 | E | 5 | E(String data) { | +| FlexibleConstructors.java:57:7:57:7 | E | 6 | var temp = data != null ? data.trim() : ""; | +| FlexibleConstructors.java:57:7:57:7 | E | 7 | this.processed = temp; | +| FlexibleConstructors.java:57:7:57:7 | E | 8 | isValid = !temp.isEmpty(); | +| FlexibleConstructors.java:57:7:57:7 | E | 9 | super(temp); | +| FlexibleConstructors.java:57:7:57:7 | E | 10 | } | +| FlexibleConstructors.java:57:7:57:7 | E | 11 | } | +| FlexibleConstructors.java:69:7:69:7 | F | 0 | class F { | +| FlexibleConstructors.java:69:7:69:7 | F | 1 | private int x; | +| FlexibleConstructors.java:69:7:69:7 | F | 2 | | +| FlexibleConstructors.java:69:7:69:7 | F | 3 | private final int y; | +| FlexibleConstructors.java:69:7:69:7 | F | 4 | | +| FlexibleConstructors.java:69:7:69:7 | F | 5 | private int sum; | +| FlexibleConstructors.java:69:7:69:7 | F | 6 | | +| FlexibleConstructors.java:69:7:69:7 | F | 7 | F(int a, int b) { | +| FlexibleConstructors.java:69:7:69:7 | F | 8 | x = a; | +| FlexibleConstructors.java:69:7:69:7 | F | 9 | this.y = b; | +| FlexibleConstructors.java:69:7:69:7 | F | 10 | this.sum = a + b; | +| FlexibleConstructors.java:69:7:69:7 | F | 11 | super(); | +| FlexibleConstructors.java:69:7:69:7 | F | 12 | } | +| FlexibleConstructors.java:69:7:69:7 | F | 13 | } | +| FlexibleConstructors.java:82:7:82:7 | G | 0 | class G { | +| FlexibleConstructors.java:82:7:82:7 | G | 1 | private void () { | +| FlexibleConstructors.java:82:7:82:7 | G | 2 | { | +| FlexibleConstructors.java:82:7:82:7 | G | 3 | instance_val = "instance"; | +| FlexibleConstructors.java:82:7:82:7 | G | 4 | } | +| FlexibleConstructors.java:82:7:82:7 | G | 5 | } | +| FlexibleConstructors.java:82:7:82:7 | G | 6 | | +| FlexibleConstructors.java:82:7:82:7 | G | 7 | private String instance_val; | +| FlexibleConstructors.java:82:7:82:7 | G | 8 | | +| FlexibleConstructors.java:82:7:82:7 | G | 9 | G(String input) { | +| FlexibleConstructors.java:82:7:82:7 | G | 10 | var tmp = input != null ? input : "default"; | +| FlexibleConstructors.java:82:7:82:7 | G | 11 | var string = tmp + "_initialized"; | +| FlexibleConstructors.java:82:7:82:7 | G | 12 | super(); | +| FlexibleConstructors.java:82:7:82:7 | G | 13 | (); | +| FlexibleConstructors.java:82:7:82:7 | G | 14 | this.instance_val = string; | +| FlexibleConstructors.java:82:7:82:7 | G | 15 | } | +| FlexibleConstructors.java:82:7:82:7 | G | 16 | } | diff --git a/java/ql/test/library-tests/flexible-constructors/PrettyPrint.ql b/java/ql/test/library-tests/flexible-constructors/PrettyPrint.ql new file mode 100644 index 000000000000..59ae62effd1b --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/PrettyPrint.ql @@ -0,0 +1,5 @@ +import semmle.code.java.PrettyPrintAst + +from ClassOrInterface cori, string s, int line +where pp(cori, s, line) and cori.fromSource() +select cori, line, s diff --git a/java/ql/test/library-tests/flexible-constructors/PrintAst.expected b/java/ql/test/library-tests/flexible-constructors/PrintAst.expected new file mode 100644 index 000000000000..e8071db72f7d --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/PrintAst.expected @@ -0,0 +1,213 @@ +FlexibleConstructors.java: +# 0| [CompilationUnit] FlexibleConstructors +# 1| 1: [Class] A +# 2| 1: [Constructor] A +#-----| 4: (Parameters) +# 2| 0: [Parameter] msg +# 2| 0: [TypeAccess] String +# 2| 5: [BlockStmt] { ... } +# 3| 1: [ExprStmt] ; +# 3| 0: [MethodCall] println(...) +# 3| -1: [VarAccess] System.out +# 3| -1: [TypeAccess] System +# 3| 0: [AddExpr] ... + ... +# 3| 0: [StringLiteral] "A: " +# 3| 1: [VarAccess] msg +# 7| 2: [Class] B +#-----| -1: (Base Types) +# 7| -1: [TypeAccess] A +# 8| 1: [Constructor] B +#-----| 4: (Parameters) +# 8| 0: [Parameter] input +# 8| 0: [TypeAccess] String +# 8| 5: [BlockStmt] { ... } +# 9| 0: [LocalVariableDeclStmt] var ...; +# 9| 1: [LocalVariableDeclExpr] msg +# 9| 0: [MethodCall] toUpperCase(...) +# 9| -1: [MethodCall] trim(...) +# 9| -1: [VarAccess] input +# 10| 1: [SuperConstructorInvocationStmt] super(...) +# 10| 0: [VarAccess] msg +# 14| 3: [Class] C +# 15| 1: [FieldDeclaration] int x; +# 15| -1: [TypeAccess] int +# 17| 2: [Constructor] C +#-----| 4: (Parameters) +# 17| 0: [Parameter] x +# 17| 0: [TypeAccess] int +# 17| 5: [BlockStmt] { ... } +# 18| 0: [IfStmt] if (...) +# 18| 0: [LTExpr] ... < ... +# 18| 0: [VarAccess] x +# 18| 1: [IntegerLiteral] 0 +# 18| 1: [ThrowStmt] throw ... +# 18| 0: [ClassInstanceExpr] new IllegalArgumentException(...) +# 18| -3: [TypeAccess] IllegalArgumentException +# 19| 1: [SuperConstructorInvocationStmt] super(...) +# 20| 2: [ExprStmt] ; +# 20| 0: [AssignExpr] ...=... +# 20| 0: [VarAccess] this.x +# 20| -1: [ThisAccess] this +# 20| 1: [VarAccess] x +# 24| 4: [Class] R +# 24| 2: [FieldDeclaration] String name; +# 24| 3: [FieldDeclaration] int score; +# 25| 4: [Constructor] R +#-----| 4: (Parameters) +# 25| 0: [Parameter] name +# 25| 0: [TypeAccess] String +# 25| 5: [BlockStmt] { ... } +# 26| 0: [LocalVariableDeclStmt] var ...; +# 26| 1: [LocalVariableDeclExpr] score +# 26| 0: [MethodCall] length(...) +# 26| -1: [VarAccess] name +# 27| 1: [ThisConstructorInvocationStmt] this(...) +# 27| 0: [VarAccess] name +# 27| 1: [VarAccess] score +# 31| 5: [Class] Outer +# 32| 3: [FieldDeclaration] String prefix; +# 32| -1: [TypeAccess] String +# 32| 0: [StringLiteral] "outer" +# 34| 4: [Class] Inner +# 35| 1: [FieldDeclaration] String full; +# 35| -1: [TypeAccess] String +# 37| 2: [Constructor] Inner +#-----| 4: (Parameters) +# 37| 0: [Parameter] suffix +# 37| 0: [TypeAccess] String +# 37| 5: [BlockStmt] { ... } +# 38| 0: [LocalVariableDeclStmt] var ...; +# 38| 1: [LocalVariableDeclExpr] combined +# 38| 0: [AddExpr] ... + ... +# 38| 0: [AddExpr] ... + ... +# 38| 0: [VarAccess] prefix +# 38| 1: [StringLiteral] "_" +# 38| 1: [VarAccess] suffix +# 39| 1: [SuperConstructorInvocationStmt] super(...) +# 40| 2: [ExprStmt] ; +# 40| 0: [AssignExpr] ...=... +# 40| 0: [VarAccess] this.full +# 40| -1: [ThisAccess] this +# 40| 1: [VarAccess] combined +# 45| 6: [Class] D +# 46| 1: [FieldDeclaration] String value; +# 46| -1: [TypeAccess] String +# 47| 2: [FieldDeclaration] int length; +# 47| -1: [TypeAccess] int +# 49| 3: [Constructor] D +#-----| 4: (Parameters) +# 49| 0: [Parameter] input +# 49| 0: [TypeAccess] String +# 49| 5: [BlockStmt] { ... } +# 50| 0: [LocalVariableDeclStmt] var ...; +# 50| 1: [LocalVariableDeclExpr] processed +# 50| 0: [MethodCall] toLowerCase(...) +# 50| -1: [VarAccess] input +# 51| 1: [ExprStmt] ; +# 51| 0: [AssignExpr] ...=... +# 51| 0: [VarAccess] value +# 51| 1: [VarAccess] processed +# 52| 2: [ExprStmt] ; +# 52| 0: [AssignExpr] ...=... +# 52| 0: [VarAccess] this.length +# 52| -1: [ThisAccess] this +# 52| 1: [MethodCall] length(...) +# 52| -1: [VarAccess] processed +# 53| 3: [SuperConstructorInvocationStmt] super(...) +# 57| 7: [Class] E +#-----| -1: (Base Types) +# 57| -1: [TypeAccess] A +# 58| 1: [FieldDeclaration] boolean isValid; +# 58| -1: [TypeAccess] boolean +# 59| 2: [FieldDeclaration] String processed; +# 59| -1: [TypeAccess] String +# 61| 3: [Constructor] E +#-----| 4: (Parameters) +# 61| 0: [Parameter] data +# 61| 0: [TypeAccess] String +# 61| 5: [BlockStmt] { ... } +# 62| 0: [LocalVariableDeclStmt] var ...; +# 62| 1: [LocalVariableDeclExpr] temp +# 62| 0: [ConditionalExpr] ...?...:... +# 62| 0: [NEExpr] ... != ... +# 62| 0: [VarAccess] data +# 62| 1: [NullLiteral] null +# 62| 1: [MethodCall] trim(...) +# 62| -1: [VarAccess] data +# 62| 2: [StringLiteral] "" +# 63| 1: [ExprStmt] ; +# 63| 0: [AssignExpr] ...=... +# 63| 0: [VarAccess] this.processed +# 63| -1: [ThisAccess] this +# 63| 1: [VarAccess] temp +# 64| 2: [ExprStmt] ; +# 64| 0: [AssignExpr] ...=... +# 64| 0: [VarAccess] isValid +# 64| 1: [LogNotExpr] !... +# 64| 0: [MethodCall] isEmpty(...) +# 64| -1: [VarAccess] temp +# 65| 3: [SuperConstructorInvocationStmt] super(...) +# 65| 0: [VarAccess] temp +# 69| 8: [Class] F +# 70| 1: [FieldDeclaration] int x; +# 70| -1: [TypeAccess] int +# 71| 2: [FieldDeclaration] int y; +# 71| -1: [TypeAccess] int +# 72| 3: [FieldDeclaration] int sum; +# 72| -1: [TypeAccess] int +# 74| 4: [Constructor] F +#-----| 4: (Parameters) +# 74| 0: [Parameter] a +# 74| 0: [TypeAccess] int +# 74| 1: [Parameter] b +# 74| 0: [TypeAccess] int +# 74| 5: [BlockStmt] { ... } +# 75| 0: [ExprStmt] ; +# 75| 0: [AssignExpr] ...=... +# 75| 0: [VarAccess] x +# 75| 1: [VarAccess] a +# 76| 1: [ExprStmt] ; +# 76| 0: [AssignExpr] ...=... +# 76| 0: [VarAccess] this.y +# 76| -1: [ThisAccess] this +# 76| 1: [VarAccess] b +# 77| 2: [ExprStmt] ; +# 77| 0: [AssignExpr] ...=... +# 77| 0: [VarAccess] this.sum +# 77| -1: [ThisAccess] this +# 77| 1: [AddExpr] ... + ... +# 77| 0: [VarAccess] a +# 77| 1: [VarAccess] b +# 78| 3: [SuperConstructorInvocationStmt] super(...) +# 82| 9: [Class] G +# 83| 2: [FieldDeclaration] String instance_val; +# 83| -1: [TypeAccess] String +# 85| 3: [BlockStmt] { ... } +# 86| 0: [ExprStmt] ; +# 86| 0: [AssignExpr] ...=... +# 86| 0: [VarAccess] instance_val +# 86| 1: [StringLiteral] "instance" +# 89| 4: [Constructor] G +#-----| 4: (Parameters) +# 89| 0: [Parameter] input +# 89| 0: [TypeAccess] String +# 89| 5: [BlockStmt] { ... } +# 90| 0: [LocalVariableDeclStmt] var ...; +# 90| 1: [LocalVariableDeclExpr] tmp +# 90| 0: [ConditionalExpr] ...?...:... +# 90| 0: [NEExpr] ... != ... +# 90| 0: [VarAccess] input +# 90| 1: [NullLiteral] null +# 90| 1: [VarAccess] input +# 90| 2: [StringLiteral] "default" +# 91| 1: [LocalVariableDeclStmt] var ...; +# 91| 1: [LocalVariableDeclExpr] string +# 91| 0: [AddExpr] ... + ... +# 91| 0: [VarAccess] tmp +# 91| 1: [StringLiteral] "_initialized" +# 92| 2: [SuperConstructorInvocationStmt] super(...) +# 93| 4: [ExprStmt] ; +# 93| 0: [AssignExpr] ...=... +# 93| 0: [VarAccess] this.instance_val +# 93| -1: [ThisAccess] this +# 93| 1: [VarAccess] string diff --git a/java/ql/test/library-tests/flexible-constructors/PrintAst.qlref b/java/ql/test/library-tests/flexible-constructors/PrintAst.qlref new file mode 100644 index 000000000000..c7fd5faf239f --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/PrintAst.qlref @@ -0,0 +1 @@ +semmle/code/java/PrintAst.ql \ No newline at end of file diff --git a/java/ql/test/library-tests/flexible-constructors/SuperPredecessor.expected b/java/ql/test/library-tests/flexible-constructors/SuperPredecessor.expected new file mode 100644 index 000000000000..dba8b4acf988 --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/SuperPredecessor.expected @@ -0,0 +1,7 @@ +| FlexibleConstructors.java:10:15:10:17 | msg | FlexibleConstructors.java:10:9:10:19 | super(...) | predecessor of explicit super() | +| FlexibleConstructors.java:18:13:18:17 | ... < ... | FlexibleConstructors.java:19:9:19:16 | super(...) | predecessor of explicit super() | +| FlexibleConstructors.java:38:17:38:48 | combined | FlexibleConstructors.java:39:13:39:20 | super(...) | predecessor of explicit super() | +| FlexibleConstructors.java:52:9:52:40 | ...=... | FlexibleConstructors.java:53:9:53:16 | super(...) | predecessor of explicit super() | +| FlexibleConstructors.java:65:15:65:18 | temp | FlexibleConstructors.java:65:9:65:20 | super(...) | predecessor of explicit super() | +| FlexibleConstructors.java:77:9:77:24 | ...=... | FlexibleConstructors.java:78:9:78:16 | super(...) | predecessor of explicit super() | +| FlexibleConstructors.java:91:13:91:41 | string | FlexibleConstructors.java:92:9:92:16 | super(...) | predecessor of explicit super() | diff --git a/java/ql/test/library-tests/flexible-constructors/SuperPredecessor.ql b/java/ql/test/library-tests/flexible-constructors/SuperPredecessor.ql new file mode 100644 index 000000000000..2a291c5e82a3 --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/SuperPredecessor.ql @@ -0,0 +1,11 @@ +import java + +from ControlFlowNode pred, ControlFlowNode supNode, SuperConstructorInvocationStmt sc +where + supNode.asStmt() = sc and + pred.getASuccessor() = supNode and + pred != supNode and + not pred.asStmt() instanceof BlockStmt and + exists(sc.getEnclosingCallable().getFile().getRelativePath()) and + sc.getLocation().getEndColumn() > sc.getLocation().getStartColumn() +select pred, sc, "predecessor of explicit super()" diff --git a/java/ql/test/library-tests/flexible-constructors/options b/java/ql/test/library-tests/flexible-constructors/options new file mode 100644 index 000000000000..db1dc01e53b7 --- /dev/null +++ b/java/ql/test/library-tests/flexible-constructors/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args --release 25 --enable-preview diff --git a/java/ql/test/library-tests/guards/Guards.java b/java/ql/test/library-tests/guards/Guards.java index aca64d6f64da..689795038c6e 100644 --- a/java/ql/test/library-tests/guards/Guards.java +++ b/java/ql/test/library-tests/guards/Guards.java @@ -26,7 +26,7 @@ void t1(int[] a, String s) { } int sz = a != null ? a.length : 0; for (int i = 0; i < sz; i++) { - chk(); // $ guarded='a != null:true' guarded='i < sz:true' guarded='sz:not 0' guarded='...?...:...:not 0' guarded='a.length:not 0' guarded='a:not null' + chk(); // $ guarded='a != null:true' guarded='i < sz:true' guarded='sz:Lower bound 1' guarded='...?...:...:Lower bound 1' guarded='a.length:Lower bound 1' guarded='a:not null' int e = a[i]; if (e > 2) break; } @@ -136,11 +136,11 @@ void t7(int[] a) { found = true; } if (found) { - chk(); // $ guarded=found:true guarded='i < a.length:true' + chk(); // $ guarded=found:true guarded='i < a.length:true' guarded='a.length:Lower bound 1' } } if (found) { - chk(); // $ guarded=found:true guarded='i < a.length:false' + chk(); // $ guarded=found:true guarded='i < a.length:false' guarded='i:Lower bound 0' } } diff --git a/java/ql/test/library-tests/guards/GuardsInline.expected b/java/ql/test/library-tests/guards/GuardsInline.expected index a76e2629cde0..b0bd3b04c62d 100644 --- a/java/ql/test/library-tests/guards/GuardsInline.expected +++ b/java/ql/test/library-tests/guards/GuardsInline.expected @@ -8,12 +8,12 @@ | Guards.java:25:7:25:11 | chk(...) | b:false | | Guards.java:25:7:25:11 | chk(...) | g(1):true | | Guards.java:25:7:25:11 | chk(...) | g(2):false | -| Guards.java:29:7:29:11 | chk(...) | '...?...:...:not 0' | +| Guards.java:29:7:29:11 | chk(...) | '...?...:...:Lower bound 1' | | Guards.java:29:7:29:11 | chk(...) | 'a != null:true' | -| Guards.java:29:7:29:11 | chk(...) | 'a.length:not 0' | +| Guards.java:29:7:29:11 | chk(...) | 'a.length:Lower bound 1' | | Guards.java:29:7:29:11 | chk(...) | 'a:not null' | | Guards.java:29:7:29:11 | chk(...) | 'i < sz:true' | -| Guards.java:29:7:29:11 | chk(...) | 'sz:not 0' | +| Guards.java:29:7:29:11 | chk(...) | 'sz:Lower bound 1' | | Guards.java:39:9:39:13 | chk(...) | 's:bar' | | Guards.java:39:9:39:13 | chk(...) | 's:match "bar"' | | Guards.java:42:9:42:13 | chk(...) | 's:foo' | @@ -85,9 +85,11 @@ | Guards.java:127:7:127:11 | chk(...) | 'o != null:false' | | Guards.java:127:7:127:11 | chk(...) | 'o:null' | | Guards.java:127:7:127:11 | chk(...) | g(1):false | +| Guards.java:139:9:139:13 | chk(...) | 'a.length:Lower bound 1' | | Guards.java:139:9:139:13 | chk(...) | 'i < a.length:true' | | Guards.java:139:9:139:13 | chk(...) | found:true | | Guards.java:143:7:143:11 | chk(...) | 'i < a.length:false' | +| Guards.java:143:7:143:11 | chk(...) | 'i:Lower bound 0' | | Guards.java:143:7:143:11 | chk(...) | found:true | | Guards.java:173:7:173:11 | chk(...) | 's:not null' | | Guards.java:173:7:173:11 | chk(...) | testNotNull1(...):true | diff --git a/java/ql/test/library-tests/guards/guardspreconditions.expected b/java/ql/test/library-tests/guards/guardspreconditions.expected index 2d4597f0282b..042fc2a05bff 100644 --- a/java/ql/test/library-tests/guards/guardspreconditions.expected +++ b/java/ql/test/library-tests/guards/guardspreconditions.expected @@ -1,35 +1,19 @@ | Preconditions.java:8:9:8:31 | assertTrue(...) | exception | Preconditions.java:7:10:7:14 | Exceptional Exit | | Preconditions.java:8:9:8:31 | assertTrue(...) | no exception | Preconditions.java:9:9:9:18 | ; | -| Preconditions.java:13:9:13:32 | assertTrue(...) | exception | Preconditions.java:12:10:12:14 | Exceptional Exit | -| Preconditions.java:13:9:13:32 | assertTrue(...) | no exception | Preconditions.java:14:9:14:18 | ; | | Preconditions.java:18:9:18:33 | assertFalse(...) | exception | Preconditions.java:17:10:17:14 | Exceptional Exit | | Preconditions.java:18:9:18:33 | assertFalse(...) | no exception | Preconditions.java:19:9:19:18 | ; | -| Preconditions.java:23:9:23:32 | assertFalse(...) | exception | Preconditions.java:22:10:22:14 | Exceptional Exit | -| Preconditions.java:23:9:23:32 | assertFalse(...) | no exception | Preconditions.java:24:9:24:18 | ; | | Preconditions.java:28:9:28:41 | assertTrue(...) | exception | Preconditions.java:27:10:27:14 | Exceptional Exit | | Preconditions.java:28:9:28:41 | assertTrue(...) | no exception | Preconditions.java:29:9:29:18 | ; | -| Preconditions.java:33:9:33:42 | assertTrue(...) | exception | Preconditions.java:32:10:32:14 | Exceptional Exit | -| Preconditions.java:33:9:33:42 | assertTrue(...) | no exception | Preconditions.java:34:9:34:18 | ; | | Preconditions.java:38:9:38:43 | assertFalse(...) | exception | Preconditions.java:37:10:37:14 | Exceptional Exit | | Preconditions.java:38:9:38:43 | assertFalse(...) | no exception | Preconditions.java:39:9:39:18 | ; | -| Preconditions.java:43:9:43:42 | assertFalse(...) | exception | Preconditions.java:42:10:42:14 | Exceptional Exit | -| Preconditions.java:43:9:43:42 | assertFalse(...) | no exception | Preconditions.java:44:9:44:18 | ; | | Preconditions.java:48:9:48:35 | assertTrue(...) | exception | Preconditions.java:47:10:47:14 | Exceptional Exit | | Preconditions.java:48:9:48:35 | assertTrue(...) | no exception | Preconditions.java:49:9:49:18 | ; | -| Preconditions.java:53:9:53:36 | assertTrue(...) | exception | Preconditions.java:52:10:52:15 | Exceptional Exit | -| Preconditions.java:53:9:53:36 | assertTrue(...) | no exception | Preconditions.java:54:9:54:18 | ; | | Preconditions.java:58:9:58:37 | assertFalse(...) | exception | Preconditions.java:57:10:57:15 | Exceptional Exit | | Preconditions.java:58:9:58:37 | assertFalse(...) | no exception | Preconditions.java:59:9:59:18 | ; | -| Preconditions.java:63:9:63:36 | assertFalse(...) | exception | Preconditions.java:62:10:62:15 | Exceptional Exit | -| Preconditions.java:63:9:63:36 | assertFalse(...) | no exception | Preconditions.java:64:9:64:18 | ; | | Preconditions.java:68:9:68:45 | assertTrue(...) | exception | Preconditions.java:67:10:67:15 | Exceptional Exit | | Preconditions.java:68:9:68:45 | assertTrue(...) | no exception | Preconditions.java:69:9:69:18 | ; | -| Preconditions.java:73:9:73:46 | assertTrue(...) | exception | Preconditions.java:72:10:72:15 | Exceptional Exit | -| Preconditions.java:73:9:73:46 | assertTrue(...) | no exception | Preconditions.java:74:9:74:18 | ; | | Preconditions.java:78:9:78:47 | assertFalse(...) | exception | Preconditions.java:77:10:77:15 | Exceptional Exit | | Preconditions.java:78:9:78:47 | assertFalse(...) | no exception | Preconditions.java:79:9:79:18 | ; | -| Preconditions.java:83:9:83:46 | assertFalse(...) | exception | Preconditions.java:82:10:82:15 | Exceptional Exit | -| Preconditions.java:83:9:83:46 | assertFalse(...) | no exception | Preconditions.java:84:9:84:18 | ; | | Preconditions.java:88:9:88:15 | t(...) | exception | Preconditions.java:87:10:87:15 | Exceptional Exit | | Preconditions.java:88:9:88:15 | t(...) | no exception | Preconditions.java:89:9:89:18 | ; | | Preconditions.java:93:9:93:16 | t(...) | exception | Preconditions.java:92:10:92:15 | Exceptional Exit | diff --git a/java/ql/test/library-tests/module-import-declarations/ImportedPackage.expected b/java/ql/test/library-tests/module-import-declarations/ImportedPackage.expected new file mode 100644 index 000000000000..64eef6870110 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/ImportedPackage.expected @@ -0,0 +1,61 @@ +| java.base | java.io | +| java.base | java.lang | +| java.base | java.lang.annotation | +| java.base | java.lang.classfile | +| java.base | java.lang.classfile.attribute | +| java.base | java.lang.classfile.constantpool | +| java.base | java.lang.classfile.instruction | +| java.base | java.lang.constant | +| java.base | java.lang.foreign | +| java.base | java.lang.invoke | +| java.base | java.lang.module | +| java.base | java.lang.ref | +| java.base | java.lang.reflect | +| java.base | java.lang.runtime | +| java.base | java.math | +| java.base | java.net | +| java.base | java.net.spi | +| java.base | java.nio | +| java.base | java.nio.channels | +| java.base | java.nio.channels.spi | +| java.base | java.nio.charset | +| java.base | java.nio.charset.spi | +| java.base | java.nio.file | +| java.base | java.nio.file.attribute | +| java.base | java.nio.file.spi | +| java.base | java.security | +| java.base | java.security.cert | +| java.base | java.security.interfaces | +| java.base | java.security.spec | +| java.base | java.text | +| java.base | java.text.spi | +| java.base | java.time | +| java.base | java.time.chrono | +| java.base | java.time.format | +| java.base | java.time.temporal | +| java.base | java.time.zone | +| java.base | java.util | +| java.base | java.util.concurrent | +| java.base | java.util.concurrent.atomic | +| java.base | java.util.concurrent.locks | +| java.base | java.util.function | +| java.base | java.util.jar | +| java.base | java.util.random | +| java.base | java.util.regex | +| java.base | java.util.spi | +| java.base | java.util.stream | +| java.base | java.util.zip | +| java.base | javax.crypto | +| java.base | javax.crypto.interfaces | +| java.base | javax.crypto.spec | +| java.base | javax.net | +| java.base | javax.net.ssl | +| java.base | javax.security.auth | +| java.base | javax.security.auth.callback | +| java.base | javax.security.auth.login | +| java.base | javax.security.auth.spi | +| java.base | javax.security.auth.x500 | +| java.base | javax.security.cert | +| java.base | jdk.internal.event | +| java.base | jdk.internal.javac | +| java.base | jdk.internal.vm.vector | diff --git a/java/ql/test/library-tests/module-import-declarations/ImportedPackage.ql b/java/ql/test/library-tests/module-import-declarations/ImportedPackage.ql new file mode 100644 index 000000000000..797cabfd5462 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/ImportedPackage.ql @@ -0,0 +1,4 @@ +import java + +from ModuleImportDeclaration mid +select mid.getModuleName(), mid.getAnImportedPackage().getName() diff --git a/java/ql/test/library-tests/module-import-declarations/ImportedType.expected b/java/ql/test/library-tests/module-import-declarations/ImportedType.expected new file mode 100644 index 000000000000..cf9064b60524 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/ImportedType.expected @@ -0,0 +1,1513 @@ +| java.base | java.io.BufferedReader | +| java.base | java.io.BufferedWriter | +| java.base | java.io.Closeable | +| java.base | java.io.File | +| java.base | java.io.FileDescriptor | +| java.base | java.io.FileFilter | +| java.base | java.io.FileNotFoundException | +| java.base | java.io.FilenameFilter | +| java.base | java.io.FilterOutputStream | +| java.base | java.io.Flushable | +| java.base | java.io.IOException | +| java.base | java.io.InputStream | +| java.base | java.io.InvalidObjectException | +| java.base | java.io.ObjectStreamException | +| java.base | java.io.OutputStream | +| java.base | java.io.PrintStream | +| java.base | java.io.PrintWriter | +| java.base | java.io.Reader | +| java.base | java.io.Serializable | +| java.base | java.io.SyncFailedException | +| java.base | java.io.UnsupportedEncodingException | +| java.base | java.io.Writer | +| java.base | java.lang.A | +| java.base | java.lang.AbstractStringBuilder | +| java.base | java.lang.Appendable | +| java.base | java.lang.AutoCloseable | +| java.base | java.lang.Boolean | +| java.base | java.lang.CharSequence | +| java.base | java.lang.Character | +| java.base | java.lang.Class | +| java.base | java.lang.Class<> | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.Class | +| java.base | java.lang.ClassFormatError | +| java.base | java.lang.ClassLoader | +| java.base | java.lang.ClassNotFoundException | +| java.base | java.lang.CloneNotSupportedException | +| java.base | java.lang.Cloneable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable<> | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable> | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable> | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Comparable | +| java.base | java.lang.Deprecated | +| java.base | java.lang.Double | +| java.base | java.lang.E | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc<> | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum$EnumDesc | +| java.base | java.lang.Enum<> | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Enum | +| java.base | java.lang.Error | +| java.base | java.lang.Exception | +| java.base | java.lang.Float | +| java.base | java.lang.FunctionalInterface | +| java.base | java.lang.IllegalAccessException | +| java.base | java.lang.IllegalArgumentException | +| java.base | java.lang.IllegalStateException | +| java.base | java.lang.InstantiationException | +| java.base | java.lang.Integer | +| java.base | java.lang.InterruptedException | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable<> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable> | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.Iterable | +| java.base | java.lang.LinkageError | +| java.base | java.lang.Long | +| java.base | java.lang.Module | +| java.base | java.lang.ModuleLayer | +| java.base | java.lang.ModuleLayer$Controller | +| java.base | java.lang.NamedPackage | +| java.base | java.lang.NoSuchFieldException | +| java.base | java.lang.NoSuchMethodException | +| java.base | java.lang.Number | +| java.base | java.lang.NumberFormatException | +| java.base | java.lang.Object | +| java.base | java.lang.Package | +| java.base | java.lang.Process | +| java.base | java.lang.ProcessHandle | +| java.base | java.lang.ProcessHandle$Info | +| java.base | java.lang.R | +| java.base | java.lang.Readable | +| java.base | java.lang.Record | +| java.base | java.lang.ReflectiveOperationException | +| java.base | java.lang.Runnable | +| java.base | java.lang.Runtime | +| java.base | java.lang.Runtime$Version | +| java.base | java.lang.RuntimeException | +| java.base | java.lang.SafeVarargs | +| java.base | java.lang.SecurityException | +| java.base | java.lang.StackTraceElement | +| java.base | java.lang.String | +| java.base | java.lang.StringBuffer | +| java.base | java.lang.StringBuilder | +| java.base | java.lang.T | +| java.base | java.lang.Thread | +| java.base | java.lang.Thread$Builder | +| java.base | java.lang.Thread$Builder$OfPlatform | +| java.base | java.lang.Thread$Builder$OfVirtual | +| java.base | java.lang.Thread$State | +| java.base | java.lang.Thread$UncaughtExceptionHandler | +| java.base | java.lang.ThreadBuilders | +| java.base | java.lang.ThreadBuilders$BaseThreadBuilder | +| java.base | java.lang.ThreadBuilders$PlatformThreadBuilder | +| java.base | java.lang.ThreadBuilders$VirtualThreadBuilder | +| java.base | java.lang.ThreadGroup | +| java.base | java.lang.Throwable | +| java.base | java.lang.TypeNotPresentException | +| java.base | java.lang.U | +| java.base | java.lang.Void | +| java.base | java.lang.annotation.Annotation | +| java.base | java.lang.annotation.Documented | +| java.base | java.lang.annotation.ElementType | +| java.base | java.lang.annotation.Retention | +| java.base | java.lang.annotation.RetentionPolicy | +| java.base | java.lang.annotation.Target | +| java.base | java.lang.constant.AsTypeMethodHandleDesc | +| java.base | java.lang.constant.ClassDesc | +| java.base | java.lang.constant.Constable | +| java.base | java.lang.constant.ConstantDesc | +| java.base | java.lang.constant.DirectMethodHandleDesc | +| java.base | java.lang.constant.DirectMethodHandleDesc$Kind | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc<> | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc> | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.DynamicConstantDesc | +| java.base | java.lang.constant.MethodHandleDesc | +| java.base | java.lang.constant.MethodTypeDesc | +| java.base | java.lang.constant.T | +| java.base | java.lang.foreign.AddressLayout | +| java.base | java.lang.foreign.Arena | +| java.base | java.lang.foreign.GroupLayout | +| java.base | java.lang.foreign.MemoryLayout | +| java.base | java.lang.foreign.MemoryLayout$PathElement | +| java.base | java.lang.foreign.MemorySegment | +| java.base | java.lang.foreign.MemorySegment$Scope | +| java.base | java.lang.foreign.PaddingLayout | +| java.base | java.lang.foreign.SegmentAllocator | +| java.base | java.lang.foreign.SequenceLayout | +| java.base | java.lang.foreign.StructLayout | +| java.base | java.lang.foreign.UnionLayout | +| java.base | java.lang.foreign.ValueLayout | +| java.base | java.lang.foreign.ValueLayout$OfBoolean | +| java.base | java.lang.foreign.ValueLayout$OfByte | +| java.base | java.lang.foreign.ValueLayout$OfChar | +| java.base | java.lang.foreign.ValueLayout$OfDouble | +| java.base | java.lang.foreign.ValueLayout$OfFloat | +| java.base | java.lang.foreign.ValueLayout$OfInt | +| java.base | java.lang.foreign.ValueLayout$OfLong | +| java.base | java.lang.foreign.ValueLayout$OfShort | +| java.base | java.lang.invoke.BoundMethodHandle | +| java.base | java.lang.invoke.DelegatingMethodHandle | +| java.base | java.lang.invoke.DirectMethodHandle | +| java.base | java.lang.invoke.DirectMethodHandle$Accessor | +| java.base | java.lang.invoke.DirectMethodHandle$Constructor | +| java.base | java.lang.invoke.DirectMethodHandle$Interface | +| java.base | java.lang.invoke.DirectMethodHandle$Special | +| java.base | java.lang.invoke.DirectMethodHandle$StaticAccessor | +| java.base | java.lang.invoke.F | +| java.base | java.lang.invoke.IndirectVarHandle | +| java.base | java.lang.invoke.LambdaForm | +| java.base | java.lang.invoke.LazyInitializingVarHandle | +| java.base | java.lang.invoke.M | +| java.base | java.lang.invoke.MethodHandle | +| java.base | java.lang.invoke.MethodHandleImpl | +| java.base | java.lang.invoke.MethodHandleImpl$AsVarargsCollector | +| java.base | java.lang.invoke.MethodHandleImpl$CountingWrapper | +| java.base | java.lang.invoke.MethodHandleImpl$IntrinsicMethodHandle | +| java.base | java.lang.invoke.MethodHandleImpl$WrappedMember | +| java.base | java.lang.invoke.MethodHandleInfo | +| java.base | java.lang.invoke.MethodHandles | +| java.base | java.lang.invoke.MethodHandles$Lookup | +| java.base | java.lang.invoke.MethodHandles$Lookup$ClassOption | +| java.base | java.lang.invoke.MethodType | +| java.base | java.lang.invoke.NativeMethodHandle | +| java.base | java.lang.invoke.SegmentVarHandle | +| java.base | java.lang.invoke.T | +| java.base | java.lang.invoke.TypeDescriptor | +| java.base | java.lang.invoke.TypeDescriptor$OfField | +| java.base | java.lang.invoke.TypeDescriptor$OfField<> | +| java.base | java.lang.invoke.TypeDescriptor$OfField> | +| java.base | java.lang.invoke.TypeDescriptor$OfField | +| java.base | java.lang.invoke.TypeDescriptor$OfField | +| java.base | java.lang.invoke.TypeDescriptor$OfMethod | +| java.base | java.lang.invoke.TypeDescriptor$OfMethod<> | +| java.base | java.lang.invoke.TypeDescriptor$OfMethod,MethodType> | +| java.base | java.lang.invoke.TypeDescriptor$OfMethod | +| java.base | java.lang.invoke.VarForm | +| java.base | java.lang.invoke.VarHandle | +| java.base | java.lang.invoke.VarHandle$AccessMode | +| java.base | java.lang.invoke.VarHandle$VarHandleDesc | +| java.base | java.lang.invoke.VarHandleBooleans | +| java.base | java.lang.invoke.VarHandleBooleans$Array | +| java.base | java.lang.invoke.VarHandleBooleans$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleBooleans$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleBooleans$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleBooleans$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleByteArrayAsChars | +| java.base | java.lang.invoke.VarHandleByteArrayAsChars$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsChars$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsChars$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsDoubles | +| java.base | java.lang.invoke.VarHandleByteArrayAsDoubles$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsDoubles$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsDoubles$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsFloats | +| java.base | java.lang.invoke.VarHandleByteArrayAsFloats$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsFloats$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsFloats$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsInts | +| java.base | java.lang.invoke.VarHandleByteArrayAsInts$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsInts$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsInts$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsLongs | +| java.base | java.lang.invoke.VarHandleByteArrayAsLongs$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsLongs$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsLongs$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsShorts | +| java.base | java.lang.invoke.VarHandleByteArrayAsShorts$ArrayHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsShorts$ByteArrayViewVarHandle | +| java.base | java.lang.invoke.VarHandleByteArrayAsShorts$ByteBufferHandle | +| java.base | java.lang.invoke.VarHandleByteArrayBase | +| java.base | java.lang.invoke.VarHandleBytes | +| java.base | java.lang.invoke.VarHandleBytes$Array | +| java.base | java.lang.invoke.VarHandleBytes$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleBytes$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleBytes$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleBytes$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleChars | +| java.base | java.lang.invoke.VarHandleChars$Array | +| java.base | java.lang.invoke.VarHandleChars$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleChars$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleChars$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleChars$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleDoubles | +| java.base | java.lang.invoke.VarHandleDoubles$Array | +| java.base | java.lang.invoke.VarHandleDoubles$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleDoubles$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleDoubles$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleDoubles$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleFloats | +| java.base | java.lang.invoke.VarHandleFloats$Array | +| java.base | java.lang.invoke.VarHandleFloats$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleFloats$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleFloats$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleFloats$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleInts | +| java.base | java.lang.invoke.VarHandleInts$Array | +| java.base | java.lang.invoke.VarHandleInts$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleInts$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleInts$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleInts$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleLongs | +| java.base | java.lang.invoke.VarHandleLongs$Array | +| java.base | java.lang.invoke.VarHandleLongs$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleLongs$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleLongs$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleLongs$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleReferences | +| java.base | java.lang.invoke.VarHandleReferences$Array | +| java.base | java.lang.invoke.VarHandleReferences$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleReferences$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleReferences$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleReferences$FieldStaticReadWrite | +| java.base | java.lang.invoke.VarHandleShorts | +| java.base | java.lang.invoke.VarHandleShorts$Array | +| java.base | java.lang.invoke.VarHandleShorts$FieldInstanceReadOnly | +| java.base | java.lang.invoke.VarHandleShorts$FieldInstanceReadWrite | +| java.base | java.lang.invoke.VarHandleShorts$FieldStaticReadOnly | +| java.base | java.lang.invoke.VarHandleShorts$FieldStaticReadWrite | +| java.base | java.lang.module.Configuration | +| java.base | java.lang.module.ModuleDescriptor | +| java.base | java.lang.module.ModuleDescriptor$Builder | +| java.base | java.lang.module.ModuleDescriptor$Exports | +| java.base | java.lang.module.ModuleDescriptor$Exports$Modifier | +| java.base | java.lang.module.ModuleDescriptor$Modifier | +| java.base | java.lang.module.ModuleDescriptor$Opens | +| java.base | java.lang.module.ModuleDescriptor$Opens$Modifier | +| java.base | java.lang.module.ModuleDescriptor$Provides | +| java.base | java.lang.module.ModuleDescriptor$Requires | +| java.base | java.lang.module.ModuleDescriptor$Requires$Modifier | +| java.base | java.lang.module.ModuleDescriptor$Version | +| java.base | java.lang.module.ModuleFinder | +| java.base | java.lang.module.ModuleReader | +| java.base | java.lang.module.ModuleReference | +| java.base | java.lang.module.ResolvedModule | +| java.base | java.lang.ref.Cleaner | +| java.base | java.lang.ref.Cleaner$Cleanable | +| java.base | java.lang.reflect.AccessFlag | +| java.base | java.lang.reflect.AccessFlag$Location | +| java.base | java.lang.reflect.AccessibleObject | +| java.base | java.lang.reflect.AnnotatedElement | +| java.base | java.lang.reflect.AnnotatedType | +| java.base | java.lang.reflect.ClassFileFormatVersion | +| java.base | java.lang.reflect.Constructor | +| java.base | java.lang.reflect.Constructor<> | +| java.base | java.lang.reflect.Constructor | +| java.base | java.lang.reflect.Constructor | +| java.base | java.lang.reflect.D | +| java.base | java.lang.reflect.Executable | +| java.base | java.lang.reflect.Field | +| java.base | java.lang.reflect.GenericDeclaration | +| java.base | java.lang.reflect.InvocationTargetException | +| java.base | java.lang.reflect.Member | +| java.base | java.lang.reflect.Method | +| java.base | java.lang.reflect.Parameter | +| java.base | java.lang.reflect.RecordComponent | +| java.base | java.lang.reflect.T | +| java.base | java.lang.reflect.Type | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.lang.reflect.TypeVariable<> | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.lang.reflect.TypeVariable | +| java.base | java.math.BigInteger | +| java.base | java.net.ContentHandler | +| java.base | java.net.ContentHandlerFactory | +| java.base | java.net.FileNameMap | +| java.base | java.net.Inet4Address | +| java.base | java.net.Inet6Address | +| java.base | java.net.InetAddress | +| java.base | java.net.InterfaceAddress | +| java.base | java.net.MalformedURLException | +| java.base | java.net.NetworkInterface | +| java.base | java.net.Proxy | +| java.base | java.net.Proxy$Type | +| java.base | java.net.SocketAddress | +| java.base | java.net.SocketException | +| java.base | java.net.URI | +| java.base | java.net.URISyntaxException | +| java.base | java.net.URL | +| java.base | java.net.URLConnection | +| java.base | java.net.URLStreamHandler | +| java.base | java.net.URLStreamHandlerFactory | +| java.base | java.net.UnknownHostException | +| java.base | java.nio.Buffer | +| java.base | java.nio.ByteBuffer | +| java.base | java.nio.ByteBufferAsCharBufferB | +| java.base | java.nio.ByteBufferAsCharBufferL | +| java.base | java.nio.ByteBufferAsCharBufferRB | +| java.base | java.nio.ByteBufferAsCharBufferRL | +| java.base | java.nio.ByteBufferAsDoubleBufferB | +| java.base | java.nio.ByteBufferAsDoubleBufferL | +| java.base | java.nio.ByteBufferAsDoubleBufferRB | +| java.base | java.nio.ByteBufferAsDoubleBufferRL | +| java.base | java.nio.ByteBufferAsFloatBufferB | +| java.base | java.nio.ByteBufferAsFloatBufferL | +| java.base | java.nio.ByteBufferAsFloatBufferRB | +| java.base | java.nio.ByteBufferAsFloatBufferRL | +| java.base | java.nio.ByteBufferAsIntBufferB | +| java.base | java.nio.ByteBufferAsIntBufferL | +| java.base | java.nio.ByteBufferAsIntBufferRB | +| java.base | java.nio.ByteBufferAsIntBufferRL | +| java.base | java.nio.ByteBufferAsLongBufferB | +| java.base | java.nio.ByteBufferAsLongBufferL | +| java.base | java.nio.ByteBufferAsLongBufferRB | +| java.base | java.nio.ByteBufferAsLongBufferRL | +| java.base | java.nio.ByteBufferAsShortBufferB | +| java.base | java.nio.ByteBufferAsShortBufferL | +| java.base | java.nio.ByteBufferAsShortBufferRB | +| java.base | java.nio.ByteBufferAsShortBufferRL | +| java.base | java.nio.ByteOrder | +| java.base | java.nio.CharBuffer | +| java.base | java.nio.DirectByteBuffer | +| java.base | java.nio.DirectByteBufferR | +| java.base | java.nio.DirectCharBufferRS | +| java.base | java.nio.DirectCharBufferRU | +| java.base | java.nio.DirectCharBufferS | +| java.base | java.nio.DirectCharBufferU | +| java.base | java.nio.DirectDoubleBufferRS | +| java.base | java.nio.DirectDoubleBufferRU | +| java.base | java.nio.DirectDoubleBufferS | +| java.base | java.nio.DirectDoubleBufferU | +| java.base | java.nio.DirectFloatBufferRS | +| java.base | java.nio.DirectFloatBufferRU | +| java.base | java.nio.DirectFloatBufferS | +| java.base | java.nio.DirectFloatBufferU | +| java.base | java.nio.DirectIntBufferRS | +| java.base | java.nio.DirectIntBufferRU | +| java.base | java.nio.DirectIntBufferS | +| java.base | java.nio.DirectIntBufferU | +| java.base | java.nio.DirectLongBufferRS | +| java.base | java.nio.DirectLongBufferRU | +| java.base | java.nio.DirectLongBufferS | +| java.base | java.nio.DirectLongBufferU | +| java.base | java.nio.DirectShortBufferRS | +| java.base | java.nio.DirectShortBufferRU | +| java.base | java.nio.DirectShortBufferS | +| java.base | java.nio.DirectShortBufferU | +| java.base | java.nio.DoubleBuffer | +| java.base | java.nio.FloatBuffer | +| java.base | java.nio.HeapByteBuffer | +| java.base | java.nio.HeapByteBufferR | +| java.base | java.nio.HeapCharBuffer | +| java.base | java.nio.HeapCharBufferR | +| java.base | java.nio.HeapDoubleBuffer | +| java.base | java.nio.HeapDoubleBufferR | +| java.base | java.nio.HeapFloatBuffer | +| java.base | java.nio.HeapFloatBufferR | +| java.base | java.nio.HeapIntBuffer | +| java.base | java.nio.HeapIntBufferR | +| java.base | java.nio.HeapLongBuffer | +| java.base | java.nio.HeapLongBufferR | +| java.base | java.nio.HeapShortBuffer | +| java.base | java.nio.HeapShortBufferR | +| java.base | java.nio.IntBuffer | +| java.base | java.nio.LongBuffer | +| java.base | java.nio.MappedByteBuffer | +| java.base | java.nio.ShortBuffer | +| java.base | java.nio.StringCharBuffer | +| java.base | java.nio.channels.A | +| java.base | java.nio.channels.AsynchronousChannel | +| java.base | java.nio.channels.AsynchronousCloseException | +| java.base | java.nio.channels.AsynchronousFileChannel | +| java.base | java.nio.channels.ByteChannel | +| java.base | java.nio.channels.Channel | +| java.base | java.nio.channels.ClosedChannelException | +| java.base | java.nio.channels.CompletionHandler | +| java.base | java.nio.channels.CompletionHandler<> | +| java.base | java.nio.channels.CompletionHandler | +| java.base | java.nio.channels.CompletionHandler | +| java.base | java.nio.channels.FileChannel | +| java.base | java.nio.channels.FileChannel$MapMode | +| java.base | java.nio.channels.FileLock | +| java.base | java.nio.channels.GatheringByteChannel | +| java.base | java.nio.channels.InterruptibleChannel | +| java.base | java.nio.channels.ReadableByteChannel | +| java.base | java.nio.channels.ScatteringByteChannel | +| java.base | java.nio.channels.SeekableByteChannel | +| java.base | java.nio.channels.V | +| java.base | java.nio.channels.WritableByteChannel | +| java.base | java.nio.channels.spi.AbstractInterruptibleChannel | +| java.base | java.nio.charset.CharacterCodingException | +| java.base | java.nio.charset.Charset | +| java.base | java.nio.charset.CharsetDecoder | +| java.base | java.nio.charset.CharsetEncoder | +| java.base | java.nio.charset.CoderResult | +| java.base | java.nio.charset.CodingErrorAction | +| java.base | java.nio.file.AccessMode | +| java.base | java.nio.file.CopyOption | +| java.base | java.nio.file.DirectoryStream | +| java.base | java.nio.file.DirectoryStream$Filter | +| java.base | java.nio.file.DirectoryStream$Filter | +| java.base | java.nio.file.DirectoryStream<> | +| java.base | java.nio.file.DirectoryStream | +| java.base | java.nio.file.FileStore | +| java.base | java.nio.file.FileSystem | +| java.base | java.nio.file.LinkOption | +| java.base | java.nio.file.OpenOption | +| java.base | java.nio.file.Path | +| java.base | java.nio.file.PathMatcher | +| java.base | java.nio.file.T | +| java.base | java.nio.file.V | +| java.base | java.nio.file.WatchEvent | +| java.base | java.nio.file.WatchEvent$Kind | +| java.base | java.nio.file.WatchEvent$Kind<> | +| java.base | java.nio.file.WatchEvent$Kind | +| java.base | java.nio.file.WatchEvent$Kind | +| java.base | java.nio.file.WatchEvent$Modifier | +| java.base | java.nio.file.WatchEvent | +| java.base | java.nio.file.WatchKey | +| java.base | java.nio.file.WatchService | +| java.base | java.nio.file.Watchable | +| java.base | java.nio.file.attribute.AttributeView | +| java.base | java.nio.file.attribute.BasicFileAttributes | +| java.base | java.nio.file.attribute.FileAttribute | +| java.base | java.nio.file.attribute.FileAttribute | +| java.base | java.nio.file.attribute.FileAttributeView | +| java.base | java.nio.file.attribute.FileStoreAttributeView | +| java.base | java.nio.file.attribute.FileTime | +| java.base | java.nio.file.attribute.GroupPrincipal | +| java.base | java.nio.file.attribute.T | +| java.base | java.nio.file.attribute.UserPrincipal | +| java.base | java.nio.file.attribute.UserPrincipalLookupService | +| java.base | java.nio.file.spi.A | +| java.base | java.nio.file.spi.FileSystemProvider | +| java.base | java.nio.file.spi.V | +| java.base | java.security.AccessControlContext | +| java.base | java.security.AccessControlException | +| java.base | java.security.AlgorithmParameters | +| java.base | java.security.AlgorithmParametersSpi | +| java.base | java.security.AsymmetricKey | +| java.base | java.security.CodeSigner | +| java.base | java.security.CodeSource | +| java.base | java.security.DEREncodable | +| java.base | java.security.DomainCombiner | +| java.base | java.security.GeneralSecurityException | +| java.base | java.security.Guard | +| java.base | java.security.InvalidAlgorithmParameterException | +| java.base | java.security.InvalidKeyException | +| java.base | java.security.Key | +| java.base | java.security.KeyException | +| java.base | java.security.KeyPair | +| java.base | java.security.NoSuchAlgorithmException | +| java.base | java.security.NoSuchProviderException | +| java.base | java.security.PEMRecord | +| java.base | java.security.Permission | +| java.base | java.security.PermissionCollection | +| java.base | java.security.Principal | +| java.base | java.security.PrivateKey | +| java.base | java.security.PrivilegedAction | +| java.base | java.security.PrivilegedAction<> | +| java.base | java.security.PrivilegedAction | +| java.base | java.security.PrivilegedActionException | +| java.base | java.security.PrivilegedExceptionAction | +| java.base | java.security.PrivilegedExceptionAction<> | +| java.base | java.security.PrivilegedExceptionAction | +| java.base | java.security.ProtectionDomain | +| java.base | java.security.Provider | +| java.base | java.security.Provider$Service | +| java.base | java.security.PublicKey | +| java.base | java.security.SecureRandom | +| java.base | java.security.SecureRandomParameters | +| java.base | java.security.SecureRandomSpi | +| java.base | java.security.SignatureException | +| java.base | java.security.T | +| java.base | java.security.Timestamp | +| java.base | java.security.cert.CRL | +| java.base | java.security.cert.CRLException | +| java.base | java.security.cert.CRLReason | +| java.base | java.security.cert.CertPath | +| java.base | java.security.cert.Certificate | +| java.base | java.security.cert.CertificateEncodingException | +| java.base | java.security.cert.CertificateException | +| java.base | java.security.cert.CertificateExpiredException | +| java.base | java.security.cert.CertificateNotYetValidException | +| java.base | java.security.cert.CertificateParsingException | +| java.base | java.security.cert.X509CRL | +| java.base | java.security.cert.X509CRLEntry | +| java.base | java.security.cert.X509Certificate | +| java.base | java.security.cert.X509Extension | +| java.base | java.security.spec.AlgorithmParameterSpec | +| java.base | java.security.spec.EncodedKeySpec | +| java.base | java.security.spec.InvalidKeySpecException | +| java.base | java.security.spec.InvalidParameterSpecException | +| java.base | java.security.spec.KeySpec | +| java.base | java.security.spec.PKCS8EncodedKeySpec | +| java.base | java.security.spec.X509EncodedKeySpec | +| java.base | java.text.AttributedCharacterIterator | +| java.base | java.text.AttributedCharacterIterator$Attribute | +| java.base | java.text.CharacterIterator | +| java.base | java.text.FieldPosition | +| java.base | java.text.Format | +| java.base | java.text.Format$Field | +| java.base | java.text.ParseException | +| java.base | java.text.ParsePosition | +| java.base | java.time.Clock | +| java.base | java.time.DayOfWeek | +| java.base | java.time.Duration | +| java.base | java.time.Instant | +| java.base | java.time.InstantSource | +| java.base | java.time.LocalDate | +| java.base | java.time.LocalDateTime | +| java.base | java.time.LocalTime | +| java.base | java.time.Month | +| java.base | java.time.OffsetDateTime | +| java.base | java.time.OffsetTime | +| java.base | java.time.Period | +| java.base | java.time.R | +| java.base | java.time.ZoneId | +| java.base | java.time.ZoneOffset | +| java.base | java.time.ZoneRegion | +| java.base | java.time.ZonedDateTime | +| java.base | java.time.chrono.AbstractChronology | +| java.base | java.time.chrono.ChronoLocalDate | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoLocalDateTime<> | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoLocalDateTime | +| java.base | java.time.chrono.ChronoPeriod | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.ChronoZonedDateTime<> | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.ChronoZonedDateTime | +| java.base | java.time.chrono.Chronology | +| java.base | java.time.chrono.D | +| java.base | java.time.chrono.Era | +| java.base | java.time.chrono.IsoChronology | +| java.base | java.time.chrono.IsoEra | +| java.base | java.time.chrono.R | +| java.base | java.time.format.DateTimeFormatter | +| java.base | java.time.format.DecimalStyle | +| java.base | java.time.format.FormatStyle | +| java.base | java.time.format.ResolverStyle | +| java.base | java.time.format.T | +| java.base | java.time.format.TextStyle | +| java.base | java.time.temporal.ChronoField | +| java.base | java.time.temporal.ChronoUnit | +| java.base | java.time.temporal.R | +| java.base | java.time.temporal.Temporal | +| java.base | java.time.temporal.TemporalAccessor | +| java.base | java.time.temporal.TemporalAdjuster | +| java.base | java.time.temporal.TemporalAmount | +| java.base | java.time.temporal.TemporalField | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery<> | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalQuery | +| java.base | java.time.temporal.TemporalUnit | +| java.base | java.time.temporal.ValueRange | +| java.base | java.time.zone.ZoneOffsetTransition | +| java.base | java.time.zone.ZoneOffsetTransitionRule | +| java.base | java.time.zone.ZoneOffsetTransitionRule$TimeDefinition | +| java.base | java.time.zone.ZoneRules | +| java.base | java.util.Collection | +| java.base | java.util.Collection<> | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection> | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Collection | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator<> | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator> | +| java.base | java.util.Comparator> | +| java.base | java.util.Comparator> | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Comparator | +| java.base | java.util.Date | +| java.base | java.util.Dictionary | +| java.base | java.util.Dictionary | +| java.base | java.util.Dictionary | +| java.base | java.util.DoubleSummaryStatistics | +| java.base | java.util.E | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration<> | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Enumeration | +| java.base | java.util.Hashtable | +| java.base | java.util.Hashtable | +| java.base | java.util.IntSummaryStatistics | +| java.base | java.util.InvalidPropertiesFormatException | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator<> | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.Iterator | +| java.base | java.util.K | +| java.base | java.util.List | +| java.base | java.util.List<> | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List> | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List> | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List> | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.List | +| java.base | java.util.ListIterator | +| java.base | java.util.ListIterator<> | +| java.base | java.util.ListIterator | +| java.base | java.util.Locale | +| java.base | java.util.Locale$Category | +| java.base | java.util.Locale$FilteringMode | +| java.base | java.util.Locale$IsoCountryCode | +| java.base | java.util.Locale$IsoCountryCode$1 | +| java.base | java.util.Locale$IsoCountryCode$2 | +| java.base | java.util.Locale$IsoCountryCode$3 | +| java.base | java.util.Locale$LanguageRange | +| java.base | java.util.LongSummaryStatistics | +| java.base | java.util.Map | +| java.base | java.util.Map$Entry | +| java.base | java.util.Map$Entry<> | +| java.base | java.util.Map$Entry | +| java.base | java.util.Map$Entry | +| java.base | java.util.Map$Entry | +| java.base | java.util.Map<> | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map> | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.Map | +| java.base | java.util.MissingResourceException | +| java.base | java.util.Optional | +| java.base | java.util.Optional<> | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional> | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.Optional | +| java.base | java.util.OptionalDouble | +| java.base | java.util.OptionalInt | +| java.base | java.util.OptionalLong | +| java.base | java.util.PrimitiveIterator | +| java.base | java.util.PrimitiveIterator$OfDouble | +| java.base | java.util.PrimitiveIterator$OfInt | +| java.base | java.util.PrimitiveIterator$OfLong | +| java.base | java.util.PrimitiveIterator | +| java.base | java.util.PrimitiveIterator | +| java.base | java.util.PrimitiveIterator | +| java.base | java.util.Properties | +| java.base | java.util.Random | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection<> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection> | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedCollection | +| java.base | java.util.SequencedMap | +| java.base | java.util.SequencedMap<> | +| java.base | java.util.SequencedMap | +| java.base | java.util.SequencedMap | +| java.base | java.util.SequencedSet | +| java.base | java.util.SequencedSet<> | +| java.base | java.util.SequencedSet> | +| java.base | java.util.SequencedSet | +| java.base | java.util.Set | +| java.base | java.util.Set<> | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set> | +| java.base | java.util.Set> | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.Set | +| java.base | java.util.SortedMap | +| java.base | java.util.SortedMap<> | +| java.base | java.util.SortedMap | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator$OfDouble | +| java.base | java.util.Spliterator$OfInt | +| java.base | java.util.Spliterator$OfLong | +| java.base | java.util.Spliterator$OfPrimitive | +| java.base | java.util.Spliterator$OfPrimitive<> | +| java.base | java.util.Spliterator$OfPrimitive | +| java.base | java.util.Spliterator$OfPrimitive | +| java.base | java.util.Spliterator$OfPrimitive | +| java.base | java.util.Spliterator<> | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.Spliterator | +| java.base | java.util.T | +| java.base | java.util.T_CONS | +| java.base | java.util.T_SPLITR | +| java.base | java.util.U | +| java.base | java.util.V | +| java.base | java.util.X | +| java.base | java.util.concurrent.Callable | +| java.base | java.util.concurrent.Callable<> | +| java.base | java.util.concurrent.Callable | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture<> | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletableFuture | +| java.base | java.util.concurrent.CompletionException | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage<> | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.CompletionStage | +| java.base | java.util.concurrent.ExecutionException | +| java.base | java.util.concurrent.Executor | +| java.base | java.util.concurrent.ExecutorService | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future$State | +| java.base | java.util.concurrent.Future<> | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.Future | +| java.base | java.util.concurrent.T | +| java.base | java.util.concurrent.ThreadFactory | +| java.base | java.util.concurrent.TimeUnit | +| java.base | java.util.concurrent.TimeoutException | +| java.base | java.util.concurrent.U | +| java.base | java.util.concurrent.V | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer<> | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer> | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer> | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer | +| java.base | java.util.function.BiConsumer> | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction<> | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction,RuntimeException> | +| java.base | java.util.function.BiFunction,V> | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BiFunction | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.BinaryOperator<> | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.BinaryOperator | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer<> | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.Consumer | +| java.base | java.util.function.DoubleBinaryOperator | +| java.base | java.util.function.DoubleConsumer | +| java.base | java.util.function.DoubleFunction | +| java.base | java.util.function.DoubleFunction<> | +| java.base | java.util.function.DoubleFunction | +| java.base | java.util.function.DoubleFunction | +| java.base | java.util.function.DoublePredicate | +| java.base | java.util.function.DoubleSupplier | +| java.base | java.util.function.DoubleToIntFunction | +| java.base | java.util.function.DoubleToLongFunction | +| java.base | java.util.function.DoubleUnaryOperator | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function<> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function> | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.Function | +| java.base | java.util.function.IntBinaryOperator | +| java.base | java.util.function.IntConsumer | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntFunction<> | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntFunction | +| java.base | java.util.function.IntPredicate | +| java.base | java.util.function.IntSupplier | +| java.base | java.util.function.IntToDoubleFunction | +| java.base | java.util.function.IntToLongFunction | +| java.base | java.util.function.IntUnaryOperator | +| java.base | java.util.function.LongBinaryOperator | +| java.base | java.util.function.LongConsumer | +| java.base | java.util.function.LongFunction | +| java.base | java.util.function.LongFunction<> | +| java.base | java.util.function.LongFunction | +| java.base | java.util.function.LongFunction | +| java.base | java.util.function.LongPredicate | +| java.base | java.util.function.LongSupplier | +| java.base | java.util.function.LongToDoubleFunction | +| java.base | java.util.function.LongToIntFunction | +| java.base | java.util.function.LongUnaryOperator | +| java.base | java.util.function.ObjDoubleConsumer | +| java.base | java.util.function.ObjDoubleConsumer<> | +| java.base | java.util.function.ObjDoubleConsumer | +| java.base | java.util.function.ObjIntConsumer | +| java.base | java.util.function.ObjIntConsumer<> | +| java.base | java.util.function.ObjIntConsumer | +| java.base | java.util.function.ObjLongConsumer | +| java.base | java.util.function.ObjLongConsumer<> | +| java.base | java.util.function.ObjLongConsumer | +| java.base | java.util.function.Predicate | +| java.base | java.util.function.Predicate<> | +| java.base | java.util.function.Predicate | +| java.base | java.util.function.Predicate | +| java.base | java.util.function.Predicate | +| java.base | java.util.function.R | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier<> | +| java.base | java.util.function.Supplier> | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.Supplier> | +| java.base | java.util.function.Supplier | +| java.base | java.util.function.T | +| java.base | java.util.function.ToDoubleFunction | +| java.base | java.util.function.ToDoubleFunction<> | +| java.base | java.util.function.ToDoubleFunction | +| java.base | java.util.function.ToIntFunction | +| java.base | java.util.function.ToIntFunction<> | +| java.base | java.util.function.ToIntFunction | +| java.base | java.util.function.ToLongFunction | +| java.base | java.util.function.ToLongFunction<> | +| java.base | java.util.function.ToLongFunction | +| java.base | java.util.function.U | +| java.base | java.util.function.UnaryOperator | +| java.base | java.util.function.UnaryOperator<> | +| java.base | java.util.function.UnaryOperator | +| java.base | java.util.function.UnaryOperator | +| java.base | java.util.function.UnaryOperator | +| java.base | java.util.function.V | +| java.base | java.util.random.RandomGenerator | +| java.base | java.util.stream.A | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream<> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.BaseStream> | +| java.base | java.util.stream.Collector | +| java.base | java.util.stream.Collector$Characteristics | +| java.base | java.util.stream.Collector<> | +| java.base | java.util.stream.Collector | +| java.base | java.util.stream.Collector | +| java.base | java.util.stream.Collector | +| java.base | java.util.stream.DoubleStream | +| java.base | java.util.stream.DoubleStream$Builder | +| java.base | java.util.stream.DoubleStream$DoubleMapMultiConsumer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer$Downstream | +| java.base | java.util.stream.Gatherer$Downstream | +| java.base | java.util.stream.Gatherer$Integrator | +| java.base | java.util.stream.Gatherer$Integrator$Greedy | +| java.base | java.util.stream.Gatherer$Integrator$Greedy<> | +| java.base | java.util.stream.Gatherer$Integrator$Greedy | +| java.base | java.util.stream.Gatherer$Integrator<> | +| java.base | java.util.stream.Gatherer$Integrator | +| java.base | java.util.stream.Gatherer$Integrator | +| java.base | java.util.stream.Gatherer<> | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.Gatherer | +| java.base | java.util.stream.IntStream | +| java.base | java.util.stream.IntStream$Builder | +| java.base | java.util.stream.IntStream$IntMapMultiConsumer | +| java.base | java.util.stream.LongStream | +| java.base | java.util.stream.LongStream$Builder | +| java.base | java.util.stream.LongStream$LongMapMultiConsumer | +| java.base | java.util.stream.R | +| java.base | java.util.stream.RR | +| java.base | java.util.stream.S | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream$Builder | +| java.base | java.util.stream.Stream$Builder<> | +| java.base | java.util.stream.Stream$Builder | +| java.base | java.util.stream.Stream<> | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.Stream | +| java.base | java.util.stream.T | +| java.base | java.util.stream.U | +| java.base | javax.crypto.BadPaddingException | +| java.base | javax.crypto.Cipher | +| java.base | javax.crypto.CipherSpi | +| java.base | javax.crypto.EncryptedPrivateKeyInfo | +| java.base | javax.crypto.ExemptionMechanism | +| java.base | javax.crypto.ExemptionMechanismException | +| java.base | javax.crypto.ExemptionMechanismSpi | +| java.base | javax.crypto.IllegalBlockSizeException | +| java.base | javax.crypto.NoSuchPaddingException | +| java.base | javax.crypto.ShortBufferException | +| java.base | javax.security.auth.DestroyFailedException | +| java.base | javax.security.auth.Destroyable | +| java.base | javax.security.auth.Subject | +| java.base | javax.security.auth.T | +| java.base | javax.security.auth.x500.X500Principal | +| java.base | jdk.internal.javac.Restricted+Annotation | diff --git a/java/ql/test/library-tests/module-import-declarations/ImportedType.ql b/java/ql/test/library-tests/module-import-declarations/ImportedType.ql new file mode 100644 index 000000000000..4dfe43084ecb --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/ImportedType.ql @@ -0,0 +1,4 @@ +import java + +from ModuleImportDeclaration mid +select mid.getModuleName(), mid.getAnImportedType().getQualifiedName() diff --git a/java/ql/test/library-tests/module-import-declarations/Test.java b/java/ql/test/library-tests/module-import-declarations/Test.java new file mode 100644 index 000000000000..ed6d3dfe664f --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/Test.java @@ -0,0 +1,6 @@ +import module java.base; + +class Test { + public static void main(String[] args) { + } +} \ No newline at end of file diff --git a/java/ql/test/library-tests/module-import-declarations/options b/java/ql/test/library-tests/module-import-declarations/options new file mode 100644 index 000000000000..b510fdce0df9 --- /dev/null +++ b/java/ql/test/library-tests/module-import-declarations/options @@ -0,0 +1 @@ +//semmle-extractor-options: --javac-args --release 25 --enable-preview \ No newline at end of file diff --git a/java/ql/test/query-tests/Nullness/A.java b/java/ql/test/query-tests/Nullness/A.java index 2a3f36da4b1e..065fffdbd3fe 100644 --- a/java/ql/test/query-tests/Nullness/A.java +++ b/java/ql/test/query-tests/Nullness/A.java @@ -301,7 +301,7 @@ public void testForLoopCondition(Iterable iter) { public void assertThatTest() { Object assertThat_ok1 = maybe() ? null : new Object(); assertThat(assertThat_ok1, notNullValue()); - assertThat_ok1.toString(); + assertThat_ok1.toString(); // OK } private boolean m; diff --git a/java/ql/test/query-tests/Nullness/B.java b/java/ql/test/query-tests/Nullness/B.java index b21d581535df..1234b53d59b0 100644 --- a/java/ql/test/query-tests/Nullness/B.java +++ b/java/ql/test/query-tests/Nullness/B.java @@ -276,7 +276,7 @@ public void loopCorr(int iters) { int[] a = null; if (iters > 0) a = new int[iters]; for (int i = 0; i < iters; ++i) - a[i] = 0; // NPE - false positive + a[i] = 0; // OK if (iters > 0) { String last = null; @@ -289,7 +289,7 @@ public void loopCorr(int iters) { throw new RuntimeException(); } for (int i = 0; i < iters; ++i) { - b[i] = 0; // NPE - false positive + b[i] = 0; // OK } } @@ -331,7 +331,7 @@ public void corrConds3(Object y) { x = new Object(); } if(y instanceof String) { - x.hashCode(); // OK + x.hashCode(); // Spurious NPE - false positive } } @@ -341,7 +341,7 @@ public void corrConds4(Object y) { x = new Object(); } if(!(y instanceof String)) { - x.hashCode(); // OK + x.hashCode(); // Spurious NPE - false positive } } @@ -351,7 +351,7 @@ public void corrConds5(Object y, Object z) { x = new Object(); } if(y == z) { - x.hashCode(); // OK + x.hashCode(); // Spurious NPE - false positive } Object x2 = null; @@ -359,7 +359,7 @@ public void corrConds5(Object y, Object z) { x2 = new Object(); } if(y != z) { - x2.hashCode(); // OK + x2.hashCode(); // Spurious NPE - false positive } Object x3 = null; @@ -367,7 +367,7 @@ public void corrConds5(Object y, Object z) { x3 = new Object(); } if(!(y == z)) { - x3.hashCode(); // OK + x3.hashCode(); // Spurious NPE - false positive } } @@ -417,7 +417,7 @@ public void corrCondLoop1(boolean a[]) { x = null; } if (!b) { - x.hashCode(); // NPE - false negative + x.hashCode(); // NPE } // flow can loop around from one iteration to the next } @@ -445,7 +445,7 @@ public void loopCorrTest1(int[] a) { if (!ready) { x = null; } else { - x.hashCode(); // Spurious NPE - false positive + x.hashCode(); // OK } if ((a[i] & 1) != 0) { ready = (a[i] & 2) != 0; @@ -515,4 +515,46 @@ public void trackTest(Object o, int n) { if (c == 100) { return; } o.hashCode(); // NPE } + + public void testFinally(int[] xs, int[] ys) { + if (xs.length == 0) return; + if (ys.length == 0) return; + String s1 = null; + String s2 = null; + for (int x : xs) { + try { + if (x == 0) { break; } + s1 = "1"; + for (int y : ys) { + if (y == 0) { break; } + s2 = "2"; + } + } finally { + } + s1.hashCode(); // OK + s2.hashCode(); // NPE + } + s1.hashCode(); // NPE - false negative, Java CFG lacks proper edge label + } + + public void lenCheck(int[] xs, int n, int t) { + if (n > 42) return; + if (maybe) {} + if (n > 0 && (xs == null || xs.length < n)) { + return; + } + if (maybe) {} + if (n > 21) return; + if (maybe) {} + for (int i = 0; i < n; ++i) { + xs[i]++; // OK + } + } + + public void rangetest(int n) { + String s = null; + if (n < 0 || n > 10) s = "A"; + if (n > 100) s.hashCode(); // OK + if (n == 42) s.hashCode(); // OK + } } diff --git a/java/ql/test/query-tests/Nullness/C.java b/java/ql/test/query-tests/Nullness/C.java index 9424cbe71f22..881185abd237 100644 --- a/java/ql/test/query-tests/Nullness/C.java +++ b/java/ql/test/query-tests/Nullness/C.java @@ -97,7 +97,7 @@ public void ex7(int[] arr1) { arr2 = new int[arr1.length]; } for (int i = 0; i < arr1.length; i++) - arr2[i] = arr1[i]; // NPE - false positive + arr2[i] = arr1[i]; // OK } public void ex8(int x, int lim) { @@ -107,7 +107,7 @@ public void ex8(int x, int lim) { while (!stop) { int j = 0; while (!stop && j < lim) { - int step = (j * obj.hashCode()) % 10; // NPE - false positive + int step = (j * obj.hashCode()) % 10; // OK if (step == 0) { obj.hashCode(); i += 1; @@ -134,7 +134,7 @@ public void ex9(boolean cond, Object obj1) { cond = true; } if (cond) { - obj2.hashCode(); // NPE - false positive + obj2.hashCode(); // OK } } @@ -185,7 +185,7 @@ public void ex13(int[] a) { b = true; } else if (a[i] == 2) { verifyBool(b); - obj.hashCode(); // NPE - false positive + obj.hashCode(); // OK } } } diff --git a/java/ql/test/query-tests/Nullness/NullMaybe.expected b/java/ql/test/query-tests/Nullness/NullMaybe.expected index f0d671d58bd0..89209bd3a710 100644 --- a/java/ql/test/query-tests/Nullness/NullMaybe.expected +++ b/java/ql/test/query-tests/Nullness/NullMaybe.expected @@ -15,24 +15,24 @@ | B.java:118:5:118:7 | obj | Variable $@ may be null at this access as suggested by $@ null guard. | B.java:117:27:117:36 | obj | obj | B.java:119:13:119:23 | ... != ... | this | | B.java:133:5:133:7 | obj | Variable $@ may be null at this access because of $@ assignment. | B.java:128:5:128:22 | Object obj | obj | B.java:128:12:128:21 | obj | this | | B.java:190:7:190:7 | o | Variable $@ may be null at this access because of $@ assignment. | B.java:178:5:178:20 | Object o | o | B.java:186:5:186:12 | ...=... | this | -| B.java:279:7:279:7 | a | Variable $@ may be null at this access because of $@ assignment. | B.java:276:5:276:19 | int[] a | a | B.java:276:11:276:18 | a | this | -| B.java:292:7:292:7 | b | Variable $@ may be null at this access because of $@ assignment. | B.java:287:5:287:44 | int[] b | b | B.java:287:11:287:43 | b | this | +| B.java:334:7:334:7 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:329:5:329:20 | Object x | x | B.java:329:12:329:19 | x | this | +| B.java:344:7:344:7 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:339:5:339:20 | Object x | x | B.java:339:12:339:19 | x | this | +| B.java:354:7:354:7 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:349:5:349:20 | Object x | x | B.java:349:12:349:19 | x | this | +| B.java:362:7:362:8 | x2 | Variable $@ may be null at this access because of $@ assignment. | B.java:357:5:357:21 | Object x2 | x2 | B.java:357:12:357:20 | x2 | this | +| B.java:370:7:370:8 | x3 | Variable $@ may be null at this access because of $@ assignment. | B.java:365:5:365:21 | Object x3 | x3 | B.java:365:12:365:20 | x3 | this | | B.java:408:7:408:7 | x | Variable $@ may be null at this access as suggested by $@ null guard. | B.java:374:23:374:30 | x | x | B.java:375:23:375:31 | ... != ... | this | -| B.java:448:9:448:9 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:442:5:442:28 | Object x | x | B.java:446:9:446:16 | ...=... | this | +| B.java:420:9:420:9 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:413:5:413:28 | Object x | x | B.java:417:9:417:16 | ...=... | this | | B.java:465:9:465:9 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:458:5:458:28 | Object x | x | B.java:470:9:470:16 | ...=... | this | | B.java:487:9:487:9 | x | Variable $@ may be null at this access because of $@ assignment. | B.java:476:5:476:20 | Object x | x | B.java:476:12:476:19 | x | this | | B.java:516:5:516:5 | o | Variable $@ may be null at this access as suggested by $@ null guard. | B.java:511:25:511:32 | o | o | B.java:512:22:512:30 | ... == ... | this | +| B.java:535:7:535:8 | s2 | Variable $@ may be null at this access because of $@ assignment. | B.java:523:5:523:21 | String s2 | s2 | B.java:523:12:523:20 | s2 | this | | C.java:9:44:9:45 | a2 | Variable $@ may be null at this access as suggested by $@ null guard. | C.java:6:5:6:23 | long[][] a2 | a2 | C.java:7:34:7:54 | ... != ... | this | | C.java:9:44:9:45 | a2 | Variable $@ may be null at this access because of $@ assignment. | C.java:6:5:6:23 | long[][] a2 | a2 | C.java:6:14:6:22 | a2 | this | | C.java:10:17:10:18 | a3 | Variable $@ may be null at this access as suggested by $@ null guard. | C.java:8:5:8:21 | long[] a3 | a3 | C.java:9:38:9:58 | ... != ... | this | | C.java:10:17:10:18 | a3 | Variable $@ may be null at this access because of $@ assignment. | C.java:8:5:8:21 | long[] a3 | a3 | C.java:8:12:8:20 | a3 | this | | C.java:21:7:21:8 | s1 | Variable $@ may be null at this access because of $@ assignment. | C.java:14:5:14:30 | String s1 | s1 | C.java:17:7:17:24 | ...=... | this | | C.java:51:7:51:11 | slice | Variable $@ may be null at this access because of $@ assignment. | C.java:43:5:43:30 | List slice | slice | C.java:43:18:43:29 | slice | this | -| C.java:100:7:100:10 | arr2 | Variable $@ may be null at this access because of $@ assignment. | C.java:95:5:95:22 | int[] arr2 | arr2 | C.java:95:11:95:21 | arr2 | this | -| C.java:110:25:110:27 | obj | Variable $@ may be null at this access because of $@ assignment. | C.java:106:5:106:30 | Object obj | obj | C.java:118:13:118:22 | ...=... | this | -| C.java:137:7:137:10 | obj2 | Variable $@ may be null at this access as suggested by $@ null guard. | C.java:131:5:131:23 | Object obj2 | obj2 | C.java:132:9:132:20 | ... != ... | this | | C.java:144:15:144:15 | a | Variable $@ may be null at this access as suggested by $@ null guard. | C.java:141:20:141:26 | a | a | C.java:142:13:142:21 | ... == ... | this | -| C.java:188:9:188:11 | obj | Variable $@ may be null at this access because of $@ assignment. | C.java:181:5:181:22 | Object obj | obj | C.java:181:12:181:21 | obj | this | | C.java:219:9:219:10 | o1 | Variable $@ may be null at this access as suggested by $@ null guard. | C.java:212:20:212:28 | o1 | o1 | C.java:213:9:213:18 | ... == ... | this | | C.java:233:7:233:8 | xs | Variable $@ may be null at this access because of $@ assignment. | C.java:231:5:231:56 | int[] xs | xs | C.java:231:11:231:55 | xs | this | | F.java:11:5:11:7 | obj | Variable $@ may be null at this access as suggested by $@ null guard. | F.java:8:18:8:27 | obj | obj | F.java:9:9:9:19 | ... == ... | this | diff --git a/javascript/documentation/library-customization.rst b/javascript/documentation/library-customization.rst index b06e5b5cab1f..0960da8a112b 100644 --- a/javascript/documentation/library-customization.rst +++ b/javascript/documentation/library-customization.rst @@ -178,7 +178,7 @@ added by extending ``Dataflow::SourceNode::Range``. Some of its subclasses can s extended. For example, ``DataFlow::ModuleImportNode`` models module imports, and ``DataFlow::ClassNode`` models class definitions. The former provides default implementations covering CommonJS, AMD, and ECMAScript 2015 modules, while the latter handles ECMAScript 2015 classes, as well as traditional function-based -classes. You can extend their corresponding ``::Range`` classes to add support for other module or +classes. You can extend their corresponding ``::Range`` classes to add support for other module or class systems. Type inference diff --git a/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/old.dbscheme b/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/old.dbscheme new file mode 100644 index 000000000000..80b2bc241893 --- /dev/null +++ b/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/old.dbscheme @@ -0,0 +1,1205 @@ +/*** Standard fragments ***/ + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +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 +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- JavaScript-specific part -*/ + +@location = @location_default + +@sourceline = @locatable; + +filetype( + int file: @file ref, + string filetype: string ref +) + +// top-level code fragments +toplevels (unique int id: @toplevel, + int kind: int ref); + +is_externs (int toplevel: @toplevel ref); + +case @toplevel.kind of + 0 = @script +| 1 = @inline_script +| 2 = @event_handler +| 3 = @javascript_url +| 4 = @template_toplevel; + +is_module (int tl: @toplevel ref); +is_nodejs (int tl: @toplevel ref); +is_es2015_module (int tl: @toplevel ref); +is_closure_module (int tl: @toplevel ref); + +@xml_node_with_code = @xmlelement | @xmlattribute | @template_placeholder_tag; +toplevel_parent_xml_node( + unique int toplevel: @toplevel ref, + int xmlnode: @xml_node_with_code ref); + +xml_element_parent_expression( + unique int xmlnode: @xmlelement ref, + int expression: @expr ref, + int index: int ref); + +// statements +#keyset[parent, idx] +stmts (unique int id: @stmt, + int kind: int ref, + int parent: @stmt_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +stmt_containers (unique int stmt: @stmt ref, + int container: @stmt_container ref); + +jump_targets (unique int jump: @stmt ref, + int target: @stmt ref); + +@stmt_parent = @stmt | @toplevel | @function_expr | @arrow_function_expr | @static_initializer; +@stmt_container = @toplevel | @function | @namespace_declaration | @external_module_declaration | @global_augmentation_declaration; + +case @stmt.kind of + 0 = @empty_stmt +| 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @labeled_stmt +| 5 = @break_stmt +| 6 = @continue_stmt +| 7 = @with_stmt +| 8 = @switch_stmt +| 9 = @return_stmt +| 10 = @throw_stmt +| 11 = @try_stmt +| 12 = @while_stmt +| 13 = @do_while_stmt +| 14 = @for_stmt +| 15 = @for_in_stmt +| 16 = @debugger_stmt +| 17 = @function_decl_stmt +| 18 = @var_decl_stmt +| 19 = @case +| 20 = @catch_clause +| 21 = @for_of_stmt +| 22 = @const_decl_stmt +| 23 = @let_stmt +| 24 = @legacy_let_stmt +| 25 = @for_each_stmt +| 26 = @class_decl_stmt +| 27 = @import_declaration +| 28 = @export_all_declaration +| 29 = @export_default_declaration +| 30 = @export_named_declaration +| 31 = @namespace_declaration +| 32 = @import_equals_declaration +| 33 = @export_assign_declaration +| 34 = @interface_declaration +| 35 = @type_alias_declaration +| 36 = @enum_declaration +| 37 = @external_module_declaration +| 38 = @export_as_namespace_declaration +| 39 = @global_augmentation_declaration +| 40 = @using_decl_stmt +; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @let_stmt | @legacy_let_stmt | @using_decl_stmt; + +@export_declaration = @export_all_declaration | @export_default_declaration | @export_named_declaration; + +@namespace_definition = @namespace_declaration | @enum_declaration; +@type_definition = @class_definition | @interface_declaration | @enum_declaration | @type_alias_declaration | @enum_member; + +is_instantiated(unique int decl: @namespace_declaration ref); + +@declarable_node = @decl_stmt | @namespace_declaration | @class_decl_stmt | @function_decl_stmt | @enum_declaration | @external_module_declaration | @global_augmentation_declaration | @field; +has_declare_keyword(unique int stmt: @declarable_node ref); + +is_for_await_of(unique int forof: @for_of_stmt ref); + +// expressions +#keyset[parent, idx] +exprs (unique int id: @expr, + int kind: int ref, + int parent: @expr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +literals (varchar(900) value: string ref, + varchar(900) raw: string ref, + unique int expr: @expr_or_type ref); + +enclosing_stmt (unique int expr: @expr_or_type ref, + int stmt: @stmt ref); + +expr_containers (unique int expr: @expr_or_type ref, + int container: @stmt_container ref); + +array_size (unique int ae: @arraylike ref, + int sz: int ref); + +is_delegating (int yield: @yield_expr ref); + +@expr_or_stmt = @expr | @stmt; +@expr_or_type = @expr | @typeexpr; +@expr_parent = @expr_or_stmt | @property | @function_typeexpr; +@arraylike = @array_expr | @array_pattern; +@type_annotation = @typeexpr | @jsdoc_type_expr; +@node_in_stmt_container = @cfg_node | @type_annotation | @toplevel; + +case @expr.kind of + 0 = @label +| 1 = @null_literal +| 2 = @boolean_literal +| 3 = @number_literal +| 4 = @string_literal +| 5 = @regexp_literal +| 6 = @this_expr +| 7 = @array_expr +| 8 = @obj_expr +| 9 = @function_expr +| 10 = @seq_expr +| 11 = @conditional_expr +| 12 = @new_expr +| 13 = @call_expr +| 14 = @dot_expr +| 15 = @index_expr +| 16 = @neg_expr +| 17 = @plus_expr +| 18 = @log_not_expr +| 19 = @bit_not_expr +| 20 = @typeof_expr +| 21 = @void_expr +| 22 = @delete_expr +| 23 = @eq_expr +| 24 = @neq_expr +| 25 = @eqq_expr +| 26 = @neqq_expr +| 27 = @lt_expr +| 28 = @le_expr +| 29 = @gt_expr +| 30 = @ge_expr +| 31 = @lshift_expr +| 32 = @rshift_expr +| 33 = @urshift_expr +| 34 = @add_expr +| 35 = @sub_expr +| 36 = @mul_expr +| 37 = @div_expr +| 38 = @mod_expr +| 39 = @bitor_expr +| 40 = @xor_expr +| 41 = @bitand_expr +| 42 = @in_expr +| 43 = @instanceof_expr +| 44 = @logand_expr +| 45 = @logor_expr +| 47 = @assign_expr +| 48 = @assign_add_expr +| 49 = @assign_sub_expr +| 50 = @assign_mul_expr +| 51 = @assign_div_expr +| 52 = @assign_mod_expr +| 53 = @assign_lshift_expr +| 54 = @assign_rshift_expr +| 55 = @assign_urshift_expr +| 56 = @assign_or_expr +| 57 = @assign_xor_expr +| 58 = @assign_and_expr +| 59 = @preinc_expr +| 60 = @postinc_expr +| 61 = @predec_expr +| 62 = @postdec_expr +| 63 = @par_expr +| 64 = @var_declarator +| 65 = @arrow_function_expr +| 66 = @spread_element +| 67 = @array_pattern +| 68 = @object_pattern +| 69 = @yield_expr +| 70 = @tagged_template_expr +| 71 = @template_literal +| 72 = @template_element +| 73 = @array_comprehension_expr +| 74 = @generator_expr +| 75 = @for_in_comprehension_block +| 76 = @for_of_comprehension_block +| 77 = @legacy_letexpr +| 78 = @var_decl +| 79 = @proper_varaccess +| 80 = @class_expr +| 81 = @super_expr +| 82 = @newtarget_expr +| 83 = @named_import_specifier +| 84 = @import_default_specifier +| 85 = @import_namespace_specifier +| 86 = @named_export_specifier +| 87 = @exp_expr +| 88 = @assign_exp_expr +| 89 = @jsx_element +| 90 = @jsx_qualified_name +| 91 = @jsx_empty_expr +| 92 = @await_expr +| 93 = @function_sent_expr +| 94 = @decorator +| 95 = @export_default_specifier +| 96 = @export_namespace_specifier +| 97 = @bind_expr +| 98 = @external_module_reference +| 99 = @dynamic_import +| 100 = @expression_with_type_arguments +| 101 = @prefix_type_assertion +| 102 = @as_type_assertion +| 103 = @export_varaccess +| 104 = @decorator_list +| 105 = @non_null_assertion +| 106 = @bigint_literal +| 107 = @nullishcoalescing_expr +| 108 = @e4x_xml_anyname +| 109 = @e4x_xml_static_attribute_selector +| 110 = @e4x_xml_dynamic_attribute_selector +| 111 = @e4x_xml_filter_expression +| 112 = @e4x_xml_static_qualident +| 113 = @e4x_xml_dynamic_qualident +| 114 = @e4x_xml_dotdotexpr +| 115 = @import_meta_expr +| 116 = @assignlogandexpr +| 117 = @assignlogorexpr +| 118 = @assignnullishcoalescingexpr +| 119 = @template_pipe_ref +| 120 = @generated_code_expr +| 121 = @satisfies_expr +; + +@varaccess = @proper_varaccess | @export_varaccess; +@varref = @var_decl | @varaccess; + +@identifier = @label | @varref | @type_identifier; + +@literal = @null_literal | @boolean_literal | @number_literal | @string_literal | @regexp_literal | @bigint_literal; + +@propaccess = @dot_expr | @index_expr; + +@invokeexpr = @new_expr | @call_expr; + +@unaryexpr = @neg_expr | @plus_expr | @log_not_expr | @bit_not_expr | @typeof_expr | @void_expr | @delete_expr | @spread_element; + +@equality_test = @eq_expr | @neq_expr | @eqq_expr | @neqq_expr; + +@comparison = @equality_test | @lt_expr | @le_expr | @gt_expr | @ge_expr; + +@binaryexpr = @comparison | @lshift_expr | @rshift_expr | @urshift_expr | @add_expr | @sub_expr | @mul_expr | @div_expr | @mod_expr | @exp_expr | @bitor_expr | @xor_expr | @bitand_expr | @in_expr | @instanceof_expr | @logand_expr | @logor_expr | @nullishcoalescing_expr; + +@assignment = @assign_expr | @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_mod_expr | @assign_exp_expr | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr | @assign_or_expr | @assign_xor_expr | @assign_and_expr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr; + +@updateexpr = @preinc_expr | @postinc_expr | @predec_expr | @postdec_expr; + +@pattern = @varref | @array_pattern | @object_pattern; + +@comprehension_expr = @array_comprehension_expr | @generator_expr; + +@comprehension_block = @for_in_comprehension_block | @for_of_comprehension_block; + +@import_specifier = @named_import_specifier | @import_default_specifier | @import_namespace_specifier; + +@exportspecifier = @named_export_specifier | @export_default_specifier | @export_namespace_specifier; + +@type_keyword_operand = @import_declaration | @export_declaration | @import_specifier; + +@type_assertion = @as_type_assertion | @prefix_type_assertion; + +@class_definition = @class_decl_stmt | @class_expr; +@interface_definition = @interface_declaration | @interface_typeexpr; +@class_or_interface = @class_definition | @interface_definition; + +@lexical_decl = @var_decl | @type_decl; +@lexical_access = @varaccess | @local_type_access | @local_var_type_access | @local_namespace_access; +@lexical_ref = @lexical_decl | @lexical_access; + +@e4x_xml_attribute_selector = @e4x_xml_static_attribute_selector | @e4x_xml_dynamic_attribute_selector; +@e4x_xml_qualident = @e4x_xml_static_qualident | @e4x_xml_dynamic_qualident; + +expr_contains_template_tag_location( + int expr: @expr ref, + int location: @location ref +); + +@template_placeholder_tag_parent = @xmlelement | @xmlattribute | @file; + +template_placeholder_tag_info( + unique int node: @template_placeholder_tag, + int parentNode: @template_placeholder_tag_parent ref, + varchar(900) raw: string ref +); + +// scopes +scopes (unique int id: @scope, + int kind: int ref); + +case @scope.kind of + 0 = @global_scope +| 1 = @function_scope +| 2 = @catch_scope +| 3 = @module_scope +| 4 = @block_scope +| 5 = @for_scope +| 6 = @for_in_scope // for-of scopes work the same as for-in scopes +| 7 = @comprehension_block_scope +| 8 = @class_expr_scope +| 9 = @namespace_scope +| 10 = @class_decl_scope +| 11 = @interface_scope +| 12 = @type_alias_scope +| 13 = @mapped_type_scope +| 14 = @enum_scope +| 15 = @external_module_scope +| 16 = @conditional_type_scope; + +scopenodes (unique int node: @ast_node ref, + int scope: @scope ref); + +scopenesting (unique int inner: @scope ref, + int outer: @scope ref); + +// functions +@function = @function_decl_stmt | @function_expr | @arrow_function_expr; + +@parameterized = @function | @catch_clause; +@type_parameterized = @function | @class_or_interface | @type_alias_declaration | @mapped_typeexpr | @infer_typeexpr; + +is_generator (int fun: @function ref); +has_rest_parameter (int fun: @function ref); +is_async (int fun: @function ref); + +// variables and lexically scoped type names +#keyset[scope, name] +variables (unique int id: @variable, + varchar(900) name: string ref, + int scope: @scope ref); + +#keyset[scope, name] +local_type_names (unique int id: @local_type_name, + varchar(900) name: string ref, + int scope: @scope ref); + +#keyset[scope, name] +local_namespace_names (unique int id: @local_namespace_name, + varchar(900) name: string ref, + int scope: @scope ref); + +is_arguments_object (int id: @variable ref); + +@lexical_name = @variable | @local_type_name | @local_namespace_name; + +@bind_id = @varaccess | @local_var_type_access; +bind (unique int id: @bind_id ref, + int decl: @variable ref); + +decl (unique int id: @var_decl ref, + int decl: @variable ref); + +@typebind_id = @local_type_access | @export_varaccess; +typebind (unique int id: @typebind_id ref, + int decl: @local_type_name ref); + +@typedecl_id = @type_decl | @var_decl; +typedecl (unique int id: @typedecl_id ref, + int decl: @local_type_name ref); + +namespacedecl (unique int id: @var_decl ref, + int decl: @local_namespace_name ref); + +@namespacebind_id = @local_namespace_access | @export_varaccess; +namespacebind (unique int id: @namespacebind_id ref, + int decl: @local_namespace_name ref); + + +// properties in object literals, property patterns in object patterns, and method declarations in classes +#keyset[parent, index] +properties (unique int id: @property, + int parent: @property_parent ref, + int index: int ref, + int kind: int ref, + varchar(900) tostring: string ref); + +case @property.kind of + 0 = @value_property +| 1 = @property_getter +| 2 = @property_setter +| 3 = @jsx_attribute +| 4 = @function_call_signature +| 5 = @constructor_call_signature +| 6 = @index_signature +| 7 = @enum_member +| 8 = @proper_field +| 9 = @parameter_field +| 10 = @static_initializer +; + +@property_parent = @obj_expr | @object_pattern | @class_definition | @jsx_element | @interface_definition | @enum_declaration; +@property_accessor = @property_getter | @property_setter; +@call_signature = @function_call_signature | @constructor_call_signature; +@field = @proper_field | @parameter_field; +@field_or_vardeclarator = @field | @var_declarator; + +is_computed (int id: @property ref); +is_method (int id: @property ref); +is_static (int id: @property ref); +is_abstract_member (int id: @property ref); +is_const_enum (int id: @enum_declaration ref); +is_abstract_class (int id: @class_decl_stmt ref); + +has_public_keyword (int id: @property ref); +has_private_keyword (int id: @property ref); +has_protected_keyword (int id: @property ref); +has_readonly_keyword (int id: @property ref); +has_type_keyword (int id: @type_keyword_operand ref); +has_defer_keyword (int id: @import_declaration ref); +is_optional_member (int id: @property ref); +has_definite_assignment_assertion (int id: @field_or_vardeclarator ref); +is_optional_parameter_declaration (unique int parameter: @pattern ref); + +#keyset[constructor, param_index] +parameter_fields( + unique int field: @parameter_field ref, + int constructor: @function_expr ref, + int param_index: int ref +); + +// types +#keyset[parent, idx] +typeexprs ( + unique int id: @typeexpr, + int kind: int ref, + int parent: @typeexpr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref +); + +case @typeexpr.kind of + 0 = @local_type_access +| 1 = @type_decl +| 2 = @keyword_typeexpr +| 3 = @string_literal_typeexpr +| 4 = @number_literal_typeexpr +| 5 = @boolean_literal_typeexpr +| 6 = @array_typeexpr +| 7 = @union_typeexpr +| 8 = @indexed_access_typeexpr +| 9 = @intersection_typeexpr +| 10 = @parenthesized_typeexpr +| 11 = @tuple_typeexpr +| 12 = @keyof_typeexpr +| 13 = @qualified_type_access +| 14 = @generic_typeexpr +| 15 = @type_label +| 16 = @typeof_typeexpr +| 17 = @local_var_type_access +| 18 = @qualified_var_type_access +| 19 = @this_var_type_access +| 20 = @predicate_typeexpr +| 21 = @interface_typeexpr +| 22 = @type_parameter +| 23 = @plain_function_typeexpr +| 24 = @constructor_typeexpr +| 25 = @local_namespace_access +| 26 = @qualified_namespace_access +| 27 = @mapped_typeexpr +| 28 = @conditional_typeexpr +| 29 = @infer_typeexpr +| 30 = @import_type_access +| 31 = @import_namespace_access +| 32 = @import_var_type_access +| 33 = @optional_typeexpr +| 34 = @rest_typeexpr +| 35 = @bigint_literal_typeexpr +| 36 = @readonly_typeexpr +| 37 = @template_literal_typeexpr +; + +@typeref = @typeaccess | @type_decl; +@type_identifier = @type_decl | @local_type_access | @type_label | @local_var_type_access | @local_namespace_access; +@typeexpr_parent = @expr | @stmt | @property | @typeexpr; +@literal_typeexpr = @string_literal_typeexpr | @number_literal_typeexpr | @boolean_literal_typeexpr | @bigint_literal_typeexpr; +@typeaccess = @local_type_access | @qualified_type_access | @import_type_access; +@vartypeaccess = @local_var_type_access | @qualified_var_type_access | @this_var_type_access | @import_var_type_access; +@namespace_access = @local_namespace_access | @qualified_namespace_access | @import_namespace_access; +@import_typeexpr = @import_type_access | @import_namespace_access | @import_var_type_access; + +@function_typeexpr = @plain_function_typeexpr | @constructor_typeexpr; + +// types +types ( + unique int id: @type, + int kind: int ref, + varchar(900) tostring: string ref +); + +#keyset[parent, idx] +type_child ( + int child: @type ref, + int parent: @type ref, + int idx: int ref +); + +case @type.kind of + 0 = @any_type +| 1 = @string_type +| 2 = @number_type +| 3 = @union_type +| 4 = @true_type +| 5 = @false_type +| 6 = @type_reference +| 7 = @object_type +| 8 = @canonical_type_variable_type +| 9 = @typeof_type +| 10 = @void_type +| 11 = @undefined_type +| 12 = @null_type +| 13 = @never_type +| 14 = @plain_symbol_type +| 15 = @unique_symbol_type +| 16 = @objectkeyword_type +| 17 = @intersection_type +| 18 = @tuple_type +| 19 = @lexical_type_variable_type +| 20 = @this_type +| 21 = @number_literal_type +| 22 = @string_literal_type +| 23 = @unknown_type +| 24 = @bigint_type +| 25 = @bigint_literal_type +; + +@boolean_literal_type = @true_type | @false_type; +@symbol_type = @plain_symbol_type | @unique_symbol_type; +@union_or_intersection_type = @union_type | @intersection_type; +@typevariable_type = @canonical_type_variable_type | @lexical_type_variable_type; + +has_asserts_keyword(int node: @predicate_typeexpr ref); + +@typed_ast_node = @expr | @typeexpr | @function; +ast_node_type( + unique int node: @typed_ast_node ref, + int typ: @type ref); + +declared_function_signature( + unique int node: @function ref, + int sig: @signature_type ref +); + +invoke_expr_signature( + unique int node: @invokeexpr ref, + int sig: @signature_type ref +); + +invoke_expr_overload_index( + unique int node: @invokeexpr ref, + int index: int ref +); + +symbols ( + unique int id: @symbol, + int kind: int ref, + varchar(900) name: string ref +); + +symbol_parent ( + unique int symbol: @symbol ref, + int parent: @symbol ref +); + +symbol_module ( + int symbol: @symbol ref, + varchar(900) moduleName: string ref +); + +symbol_global ( + int symbol: @symbol ref, + varchar(900) globalName: string ref +); + +case @symbol.kind of + 0 = @root_symbol +| 1 = @member_symbol +| 2 = @other_symbol +; + +@type_with_symbol = @type_reference | @typevariable_type | @typeof_type | @unique_symbol_type; +@ast_node_with_symbol = @type_definition | @namespace_definition | @toplevel | @typeaccess | @namespace_access | @var_decl | @function | @invokeexpr | @import_declaration | @external_module_reference | @external_module_declaration; + +ast_node_symbol( + unique int node: @ast_node_with_symbol ref, + int symbol: @symbol ref); + +type_symbol( + unique int typ: @type_with_symbol ref, + int symbol: @symbol ref); + +#keyset[typ, name] +type_property( + int typ: @type ref, + varchar(900) name: string ref, + int propertyType: @type ref); + +type_alias( + unique int aliasType: @type ref, + int underlyingType: @type ref); + +@literal_type = @string_literal_type | @number_literal_type | @boolean_literal_type | @bigint_literal_type; +@type_with_literal_value = @string_literal_type | @number_literal_type | @bigint_literal_type; +type_literal_value( + unique int typ: @type_with_literal_value ref, + varchar(900) value: string ref); + +signature_types ( + unique int id: @signature_type, + int kind: int ref, + varchar(900) tostring: string ref, + int type_parameters: int ref, + int required_params: int ref +); + +is_abstract_signature( + unique int sig: @signature_type ref +); + +signature_rest_parameter( + unique int sig: @signature_type ref, + int rest_param_arra_type: @type ref +); + +case @signature_type.kind of + 0 = @function_signature_type +| 1 = @constructor_signature_type +; + +#keyset[typ, kind, index] +type_contains_signature ( + int typ: @type ref, + int kind: int ref, // constructor/call/index + int index: int ref, // ordering of overloaded signatures + int sig: @signature_type ref +); + +#keyset[parent, index] +signature_contains_type ( + int child: @type ref, + int parent: @signature_type ref, + int index: int ref +); + +#keyset[sig, index] +signature_parameter_name ( + int sig: @signature_type ref, + int index: int ref, + varchar(900) name: string ref +); + +number_index_type ( + unique int baseType: @type ref, + int propertyType: @type ref +); + +string_index_type ( + unique int baseType: @type ref, + int propertyType: @type ref +); + +base_type_names( + int typeName: @symbol ref, + int baseTypeName: @symbol ref +); + +self_types( + int typeName: @symbol ref, + int selfType: @type_reference ref +); + +tuple_type_min_length( + unique int typ: @type ref, + int minLength: int ref +); + +tuple_type_rest_index( + unique int typ: @type ref, + int index: int ref +); + +// comments +comments (unique int id: @comment, + int kind: int ref, + int toplevel: @toplevel ref, + varchar(900) text: string ref, + varchar(900) tostring: string ref); + +case @comment.kind of + 0 = @slashslash_comment +| 1 = @slashstar_comment +| 2 = @doc_comment +| 3 = @html_comment_start +| 4 = @htmlcommentend; + +@html_comment = @html_comment_start | @htmlcommentend; +@line_comment = @slashslash_comment | @html_comment; +@block_comment = @slashstar_comment | @doc_comment; + +// source lines +lines (unique int id: @line, + int toplevel: @toplevel ref, + varchar(900) text: string ref, + varchar(2) terminator: string ref); +indentation (int file: @file ref, + int lineno: int ref, + varchar(1) indentChar: string ref, + int indentDepth: int ref); + +// JavaScript parse errors +js_parse_errors (unique int id: @js_parse_error, + int toplevel: @toplevel ref, + varchar(900) message: string ref, + varchar(900) line: string ref); + +// regular expressions +#keyset[parent, idx] +regexpterm (unique int id: @regexpterm, + int kind: int ref, + int parent: @regexpparent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +@regexpparent = @regexpterm | @regexp_literal | @string_literal | @add_expr; + +case @regexpterm.kind of + 0 = @regexp_alt +| 1 = @regexp_seq +| 2 = @regexp_caret +| 3 = @regexp_dollar +| 4 = @regexp_wordboundary +| 5 = @regexp_nonwordboundary +| 6 = @regexp_positive_lookahead +| 7 = @regexp_negative_lookahead +| 8 = @regexp_star +| 9 = @regexp_plus +| 10 = @regexp_opt +| 11 = @regexp_range +| 12 = @regexp_dot +| 13 = @regexp_group +| 14 = @regexp_normal_constant +| 15 = @regexp_hex_escape +| 16 = @regexp_unicode_escape +| 17 = @regexp_dec_escape +| 18 = @regexp_oct_escape +| 19 = @regexp_ctrl_escape +| 20 = @regexp_char_class_escape +| 21 = @regexp_id_escape +| 22 = @regexp_backref +| 23 = @regexp_char_class +| 24 = @regexp_char_range +| 25 = @regexp_positive_lookbehind +| 26 = @regexp_negative_lookbehind +| 27 = @regexp_unicode_property_escape +| 28 = @regexp_quoted_string +| 29 = @regexp_intersection +| 30 = @regexp_subtraction; + +regexp_parse_errors (unique int id: @regexp_parse_error, + int regexp: @regexpterm ref, + varchar(900) message: string ref); + +@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range; +@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape; +@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape; +@regexp_constant = @regexp_normal_constant | @regexp_char_escape; +@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead; +@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind; +@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind; +@regexp_anchor = @regexp_dollar | @regexp_caret; + +is_greedy (int id: @regexp_quantifier ref); +range_quantifier_lower_bound (unique int id: @regexp_range ref, int lo: int ref); +range_quantifier_upper_bound (unique int id: @regexp_range ref, int hi: int ref); +is_capture (unique int id: @regexp_group ref, int number: int ref); +is_named_capture (unique int id: @regexp_group ref, string name: string ref); +is_inverted (int id: @regexp_char_class ref); +regexp_const_value (unique int id: @regexp_constant ref, varchar(1) value: string ref); +char_class_escape (unique int id: @regexp_char_class_escape ref, varchar(1) value: string ref); +backref (unique int id: @regexp_backref ref, int value: int ref); +named_backref (unique int id: @regexp_backref ref, string name: string ref); +unicode_property_escapename (unique int id: @regexp_unicode_property_escape ref, string name: string ref); +unicode_property_escapevalue (unique int id: @regexp_unicode_property_escape ref, string value: string ref); + +// tokens +#keyset[toplevel, idx] +tokeninfo (unique int id: @token, + int kind: int ref, + int toplevel: @toplevel ref, + int idx: int ref, + varchar(900) value: string ref); + +case @token.kind of + 0 = @token_eof +| 1 = @token_null_literal +| 2 = @token_boolean_literal +| 3 = @token_numeric_literal +| 4 = @token_string_literal +| 5 = @token_regular_expression +| 6 = @token_identifier +| 7 = @token_keyword +| 8 = @token_punctuator; + +// associate comments with the token immediately following them (which may be EOF) +next_token (int comment: @comment ref, int token: @token ref); + +// JSON +#keyset[parent, idx] +json (unique int id: @json_value, + int kind: int ref, + int parent: @json_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +json_literals (varchar(900) value: string ref, + varchar(900) raw: string ref, + unique int expr: @json_value ref); + +json_properties (int obj: @json_object ref, + varchar(900) property: string ref, + int value: @json_value ref); + +json_errors (unique int id: @json_parse_error, + varchar(900) message: string ref); + +json_locations(unique int locatable: @json_locatable ref, + int location: @location_default ref); + +case @json_value.kind of + 0 = @json_null +| 1 = @json_boolean +| 2 = @json_number +| 3 = @json_string +| 4 = @json_array +| 5 = @json_object; + +@json_parent = @json_object | @json_array | @file; + +@json_locatable = @json_value | @json_parse_error; + +// locations +@ast_node = @toplevel | @stmt | @expr | @property | @typeexpr; + +@locatable = @file + | @ast_node + | @comment + | @line + | @js_parse_error | @regexp_parse_error + | @regexpterm + | @json_locatable + | @token + | @cfg_node + | @jsdoc | @jsdoc_type_expr | @jsdoc_tag + | @yaml_locatable + | @xmllocatable + | @configLocatable + | @template_placeholder_tag; + +hasLocation (unique int locatable: @locatable ref, + int location: @location ref); + +// CFG +entry_cfg_node (unique int id: @entry_node, int container: @stmt_container ref); +exit_cfg_node (unique int id: @exit_node, int container: @stmt_container ref); +guard_node (unique int id: @guard_node, int kind: int ref, int test: @expr ref); +case @guard_node.kind of + 0 = @falsy_guard +| 1 = @truthy_guard; +@condition_guard = @falsy_guard | @truthy_guard; + +@synthetic_cfg_node = @entry_node | @exit_node | @guard_node; +@cfg_node = @synthetic_cfg_node | @expr_parent; + +successor (int pred: @cfg_node ref, int succ: @cfg_node ref); + +// JSDoc comments +jsdoc (unique int id: @jsdoc, varchar(900) description: string ref, int comment: @comment ref); +#keyset[parent, idx] +jsdoc_tags (unique int id: @jsdoc_tag, varchar(900) title: string ref, + int parent: @jsdoc ref, int idx: int ref, varchar(900) tostring: string ref); +jsdoc_tag_descriptions (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref); +jsdoc_tag_names (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref); + +#keyset[parent, idx] +jsdoc_type_exprs (unique int id: @jsdoc_type_expr, + int kind: int ref, + int parent: @jsdoc_type_expr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); +case @jsdoc_type_expr.kind of + 0 = @jsdoc_any_type_expr +| 1 = @jsdoc_null_type_expr +| 2 = @jsdoc_undefined_type_expr +| 3 = @jsdoc_unknown_type_expr +| 4 = @jsdoc_void_type_expr +| 5 = @jsdoc_identifier_type_expr +| 6 = @jsdoc_applied_type_expr +| 7 = @jsdoc_nullable_type_expr +| 8 = @jsdoc_non_nullable_type_expr +| 9 = @jsdoc_record_type_expr +| 10 = @jsdoc_array_type_expr +| 11 = @jsdoc_union_type_expr +| 12 = @jsdoc_function_type_expr +| 13 = @jsdoc_optional_type_expr +| 14 = @jsdoc_rest_type_expr +| 15 = @jsdoc_qualified_type_expr +; + +#keyset[id, idx] +jsdoc_record_field_name (int id: @jsdoc_record_type_expr ref, int idx: int ref, varchar(900) name: string ref); +jsdoc_prefix_qualifier (int id: @jsdoc_type_expr ref); +jsdoc_has_new_parameter (int fn: @jsdoc_function_type_expr ref); + +@jsdoc_type_expr_parent = @jsdoc_type_expr | @jsdoc_tag; + +jsdoc_errors (unique int id: @jsdoc_error, int tag: @jsdoc_tag ref, varchar(900) message: string ref, varchar(900) tostring: string ref); + +@dataflownode = @expr | @function_decl_stmt | @class_decl_stmt | @namespace_declaration | @enum_declaration | @property; + +@optionalchainable = @call_expr | @propaccess; + +isOptionalChaining(int id: @optionalchainable ref); + +/** + * The time taken for the extraction of a file. + * This table contains non-deterministic content. + * + * The sum of the `time` column for each (`file`, `timerKind`) pair + * is the total time taken for extraction of `file`. The `extractionPhase` + * column provides a granular view of the extraction time of the file. + */ +extraction_time( + int file : @file ref, + // see `com.semmle.js.extractor.ExtractionMetrics.ExtractionPhase`. + int extractionPhase: int ref, + // 0 for the elapsed CPU time in nanoseconds, 1 for the elapsed wallclock time in nanoseconds + int timerKind: int ref, + float time: float ref +) + +/** +* Non-timing related data for the extraction of a single file. +* This table contains non-deterministic content. +*/ +extraction_data( + int file : @file ref, + // the absolute path to the cache file + varchar(900) cacheFile: string ref, + boolean fromCache: boolean ref, + int length: int ref +) + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- 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; + +/*- Configuration files with key value pairs -*/ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); diff --git a/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/semmlecode.javascript.dbscheme b/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/semmlecode.javascript.dbscheme new file mode 100644 index 000000000000..76a926a00d5f --- /dev/null +++ b/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/semmlecode.javascript.dbscheme @@ -0,0 +1,1204 @@ +/*** Standard fragments ***/ + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +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 +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- JavaScript-specific part -*/ + +@location = @location_default + +@sourceline = @locatable; + +filetype( + int file: @file ref, + string filetype: string ref +) + +// top-level code fragments +toplevels (unique int id: @toplevel, + int kind: int ref); + +is_externs (int toplevel: @toplevel ref); + +case @toplevel.kind of + 0 = @script +| 1 = @inline_script +| 2 = @event_handler +| 3 = @javascript_url +| 4 = @template_toplevel; + +is_module (int tl: @toplevel ref); +is_nodejs (int tl: @toplevel ref); +is_es2015_module (int tl: @toplevel ref); +is_closure_module (int tl: @toplevel ref); + +@xml_node_with_code = @xmlelement | @xmlattribute | @template_placeholder_tag; +toplevel_parent_xml_node( + unique int toplevel: @toplevel ref, + int xmlnode: @xml_node_with_code ref); + +xml_element_parent_expression( + unique int xmlnode: @xmlelement ref, + int expression: @expr ref, + int index: int ref); + +// statements +#keyset[parent, idx] +stmts (unique int id: @stmt, + int kind: int ref, + int parent: @stmt_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +stmt_containers (unique int stmt: @stmt ref, + int container: @stmt_container ref); + +jump_targets (unique int jump: @stmt ref, + int target: @stmt ref); + +@stmt_parent = @stmt | @toplevel | @function_expr | @arrow_function_expr | @static_initializer; +@stmt_container = @toplevel | @function | @namespace_declaration | @external_module_declaration | @global_augmentation_declaration; + +case @stmt.kind of + 0 = @empty_stmt +| 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @labeled_stmt +| 5 = @break_stmt +| 6 = @continue_stmt +| 7 = @with_stmt +| 8 = @switch_stmt +| 9 = @return_stmt +| 10 = @throw_stmt +| 11 = @try_stmt +| 12 = @while_stmt +| 13 = @do_while_stmt +| 14 = @for_stmt +| 15 = @for_in_stmt +| 16 = @debugger_stmt +| 17 = @function_decl_stmt +| 18 = @var_decl_stmt +| 19 = @case +| 20 = @catch_clause +| 21 = @for_of_stmt +| 22 = @const_decl_stmt +| 23 = @let_stmt +| 24 = @legacy_let_stmt +| 25 = @for_each_stmt +| 26 = @class_decl_stmt +| 27 = @import_declaration +| 28 = @export_all_declaration +| 29 = @export_default_declaration +| 30 = @export_named_declaration +| 31 = @namespace_declaration +| 32 = @import_equals_declaration +| 33 = @export_assign_declaration +| 34 = @interface_declaration +| 35 = @type_alias_declaration +| 36 = @enum_declaration +| 37 = @external_module_declaration +| 38 = @export_as_namespace_declaration +| 39 = @global_augmentation_declaration +| 40 = @using_decl_stmt +; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @let_stmt | @legacy_let_stmt | @using_decl_stmt; + +@export_declaration = @export_all_declaration | @export_default_declaration | @export_named_declaration; + +@namespace_definition = @namespace_declaration | @enum_declaration; +@type_definition = @class_definition | @interface_declaration | @enum_declaration | @type_alias_declaration | @enum_member; + +is_instantiated(unique int decl: @namespace_declaration ref); + +@declarable_node = @decl_stmt | @namespace_declaration | @class_decl_stmt | @function_decl_stmt | @enum_declaration | @external_module_declaration | @global_augmentation_declaration | @field; +has_declare_keyword(unique int stmt: @declarable_node ref); + +is_for_await_of(unique int forof: @for_of_stmt ref); + +// expressions +#keyset[parent, idx] +exprs (unique int id: @expr, + int kind: int ref, + int parent: @expr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +literals (varchar(900) value: string ref, + varchar(900) raw: string ref, + unique int expr: @expr_or_type ref); + +enclosing_stmt (unique int expr: @expr_or_type ref, + int stmt: @stmt ref); + +expr_containers (unique int expr: @expr_or_type ref, + int container: @stmt_container ref); + +array_size (unique int ae: @arraylike ref, + int sz: int ref); + +is_delegating (int yield: @yield_expr ref); + +@expr_or_stmt = @expr | @stmt; +@expr_or_type = @expr | @typeexpr; +@expr_parent = @expr_or_stmt | @property | @function_typeexpr; +@arraylike = @array_expr | @array_pattern; +@type_annotation = @typeexpr | @jsdoc_type_expr; +@node_in_stmt_container = @cfg_node | @type_annotation | @toplevel; + +case @expr.kind of + 0 = @label +| 1 = @null_literal +| 2 = @boolean_literal +| 3 = @number_literal +| 4 = @string_literal +| 5 = @regexp_literal +| 6 = @this_expr +| 7 = @array_expr +| 8 = @obj_expr +| 9 = @function_expr +| 10 = @seq_expr +| 11 = @conditional_expr +| 12 = @new_expr +| 13 = @call_expr +| 14 = @dot_expr +| 15 = @index_expr +| 16 = @neg_expr +| 17 = @plus_expr +| 18 = @log_not_expr +| 19 = @bit_not_expr +| 20 = @typeof_expr +| 21 = @void_expr +| 22 = @delete_expr +| 23 = @eq_expr +| 24 = @neq_expr +| 25 = @eqq_expr +| 26 = @neqq_expr +| 27 = @lt_expr +| 28 = @le_expr +| 29 = @gt_expr +| 30 = @ge_expr +| 31 = @lshift_expr +| 32 = @rshift_expr +| 33 = @urshift_expr +| 34 = @add_expr +| 35 = @sub_expr +| 36 = @mul_expr +| 37 = @div_expr +| 38 = @mod_expr +| 39 = @bitor_expr +| 40 = @xor_expr +| 41 = @bitand_expr +| 42 = @in_expr +| 43 = @instanceof_expr +| 44 = @logand_expr +| 45 = @logor_expr +| 47 = @assign_expr +| 48 = @assign_add_expr +| 49 = @assign_sub_expr +| 50 = @assign_mul_expr +| 51 = @assign_div_expr +| 52 = @assign_mod_expr +| 53 = @assign_lshift_expr +| 54 = @assign_rshift_expr +| 55 = @assign_urshift_expr +| 56 = @assign_or_expr +| 57 = @assign_xor_expr +| 58 = @assign_and_expr +| 59 = @preinc_expr +| 60 = @postinc_expr +| 61 = @predec_expr +| 62 = @postdec_expr +| 63 = @par_expr +| 64 = @var_declarator +| 65 = @arrow_function_expr +| 66 = @spread_element +| 67 = @array_pattern +| 68 = @object_pattern +| 69 = @yield_expr +| 70 = @tagged_template_expr +| 71 = @template_literal +| 72 = @template_element +| 73 = @array_comprehension_expr +| 74 = @generator_expr +| 75 = @for_in_comprehension_block +| 76 = @for_of_comprehension_block +| 77 = @legacy_letexpr +| 78 = @var_decl +| 79 = @proper_varaccess +| 80 = @class_expr +| 81 = @super_expr +| 82 = @newtarget_expr +| 83 = @named_import_specifier +| 84 = @import_default_specifier +| 85 = @import_namespace_specifier +| 86 = @named_export_specifier +| 87 = @exp_expr +| 88 = @assign_exp_expr +| 89 = @jsx_element +| 90 = @jsx_qualified_name +| 91 = @jsx_empty_expr +| 92 = @await_expr +| 93 = @function_sent_expr +| 94 = @decorator +| 95 = @export_default_specifier +| 96 = @export_namespace_specifier +| 97 = @bind_expr +| 98 = @external_module_reference +| 99 = @dynamic_import +| 100 = @expression_with_type_arguments +| 101 = @prefix_type_assertion +| 102 = @as_type_assertion +| 103 = @export_varaccess +| 104 = @decorator_list +| 105 = @non_null_assertion +| 106 = @bigint_literal +| 107 = @nullishcoalescing_expr +| 108 = @e4x_xml_anyname +| 109 = @e4x_xml_static_attribute_selector +| 110 = @e4x_xml_dynamic_attribute_selector +| 111 = @e4x_xml_filter_expression +| 112 = @e4x_xml_static_qualident +| 113 = @e4x_xml_dynamic_qualident +| 114 = @e4x_xml_dotdotexpr +| 115 = @import_meta_expr +| 116 = @assignlogandexpr +| 117 = @assignlogorexpr +| 118 = @assignnullishcoalescingexpr +| 119 = @template_pipe_ref +| 120 = @generated_code_expr +| 121 = @satisfies_expr +; + +@varaccess = @proper_varaccess | @export_varaccess; +@varref = @var_decl | @varaccess; + +@identifier = @label | @varref | @type_identifier; + +@literal = @null_literal | @boolean_literal | @number_literal | @string_literal | @regexp_literal | @bigint_literal; + +@propaccess = @dot_expr | @index_expr; + +@invokeexpr = @new_expr | @call_expr; + +@unaryexpr = @neg_expr | @plus_expr | @log_not_expr | @bit_not_expr | @typeof_expr | @void_expr | @delete_expr | @spread_element; + +@equality_test = @eq_expr | @neq_expr | @eqq_expr | @neqq_expr; + +@comparison = @equality_test | @lt_expr | @le_expr | @gt_expr | @ge_expr; + +@binaryexpr = @comparison | @lshift_expr | @rshift_expr | @urshift_expr | @add_expr | @sub_expr | @mul_expr | @div_expr | @mod_expr | @exp_expr | @bitor_expr | @xor_expr | @bitand_expr | @in_expr | @instanceof_expr | @logand_expr | @logor_expr | @nullishcoalescing_expr; + +@assignment = @assign_expr | @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_mod_expr | @assign_exp_expr | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr | @assign_or_expr | @assign_xor_expr | @assign_and_expr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr; + +@updateexpr = @preinc_expr | @postinc_expr | @predec_expr | @postdec_expr; + +@pattern = @varref | @array_pattern | @object_pattern; + +@comprehension_expr = @array_comprehension_expr | @generator_expr; + +@comprehension_block = @for_in_comprehension_block | @for_of_comprehension_block; + +@import_specifier = @named_import_specifier | @import_default_specifier | @import_namespace_specifier; + +@exportspecifier = @named_export_specifier | @export_default_specifier | @export_namespace_specifier; + +@type_keyword_operand = @import_declaration | @export_declaration | @import_specifier; + +@type_assertion = @as_type_assertion | @prefix_type_assertion; + +@class_definition = @class_decl_stmt | @class_expr; +@interface_definition = @interface_declaration | @interface_typeexpr; +@class_or_interface = @class_definition | @interface_definition; + +@lexical_decl = @var_decl | @type_decl; +@lexical_access = @varaccess | @local_type_access | @local_var_type_access | @local_namespace_access; +@lexical_ref = @lexical_decl | @lexical_access; + +@e4x_xml_attribute_selector = @e4x_xml_static_attribute_selector | @e4x_xml_dynamic_attribute_selector; +@e4x_xml_qualident = @e4x_xml_static_qualident | @e4x_xml_dynamic_qualident; + +expr_contains_template_tag_location( + int expr: @expr ref, + int location: @location ref +); + +@template_placeholder_tag_parent = @xmlelement | @xmlattribute | @file; + +template_placeholder_tag_info( + unique int node: @template_placeholder_tag, + int parentNode: @template_placeholder_tag_parent ref, + varchar(900) raw: string ref +); + +// scopes +scopes (unique int id: @scope, + int kind: int ref); + +case @scope.kind of + 0 = @global_scope +| 1 = @function_scope +| 2 = @catch_scope +| 3 = @module_scope +| 4 = @block_scope +| 5 = @for_scope +| 6 = @for_in_scope // for-of scopes work the same as for-in scopes +| 7 = @comprehension_block_scope +| 8 = @class_expr_scope +| 9 = @namespace_scope +| 10 = @class_decl_scope +| 11 = @interface_scope +| 12 = @type_alias_scope +| 13 = @mapped_type_scope +| 14 = @enum_scope +| 15 = @external_module_scope +| 16 = @conditional_type_scope; + +scopenodes (unique int node: @ast_node ref, + int scope: @scope ref); + +scopenesting (unique int inner: @scope ref, + int outer: @scope ref); + +// functions +@function = @function_decl_stmt | @function_expr | @arrow_function_expr; + +@parameterized = @function | @catch_clause; +@type_parameterized = @function | @class_or_interface | @type_alias_declaration | @mapped_typeexpr | @infer_typeexpr; + +is_generator (int fun: @function ref); +has_rest_parameter (int fun: @function ref); +is_async (int fun: @function ref); + +// variables and lexically scoped type names +#keyset[scope, name] +variables (unique int id: @variable, + varchar(900) name: string ref, + int scope: @scope ref); + +#keyset[scope, name] +local_type_names (unique int id: @local_type_name, + varchar(900) name: string ref, + int scope: @scope ref); + +#keyset[scope, name] +local_namespace_names (unique int id: @local_namespace_name, + varchar(900) name: string ref, + int scope: @scope ref); + +is_arguments_object (int id: @variable ref); + +@lexical_name = @variable | @local_type_name | @local_namespace_name; + +@bind_id = @varaccess | @local_var_type_access; +bind (unique int id: @bind_id ref, + int decl: @variable ref); + +decl (unique int id: @var_decl ref, + int decl: @variable ref); + +@typebind_id = @local_type_access | @export_varaccess; +typebind (unique int id: @typebind_id ref, + int decl: @local_type_name ref); + +@typedecl_id = @type_decl | @var_decl; +typedecl (unique int id: @typedecl_id ref, + int decl: @local_type_name ref); + +namespacedecl (unique int id: @var_decl ref, + int decl: @local_namespace_name ref); + +@namespacebind_id = @local_namespace_access | @export_varaccess; +namespacebind (unique int id: @namespacebind_id ref, + int decl: @local_namespace_name ref); + + +// properties in object literals, property patterns in object patterns, and method declarations in classes +#keyset[parent, index] +properties (unique int id: @property, + int parent: @property_parent ref, + int index: int ref, + int kind: int ref, + varchar(900) tostring: string ref); + +case @property.kind of + 0 = @value_property +| 1 = @property_getter +| 2 = @property_setter +| 3 = @jsx_attribute +| 4 = @function_call_signature +| 5 = @constructor_call_signature +| 6 = @index_signature +| 7 = @enum_member +| 8 = @proper_field +| 9 = @parameter_field +| 10 = @static_initializer +; + +@property_parent = @obj_expr | @object_pattern | @class_definition | @jsx_element | @interface_definition | @enum_declaration; +@property_accessor = @property_getter | @property_setter; +@call_signature = @function_call_signature | @constructor_call_signature; +@field = @proper_field | @parameter_field; +@field_or_vardeclarator = @field | @var_declarator; + +is_computed (int id: @property ref); +is_method (int id: @property ref); +is_static (int id: @property ref); +is_abstract_member (int id: @property ref); +is_const_enum (int id: @enum_declaration ref); +is_abstract_class (int id: @class_decl_stmt ref); + +has_public_keyword (int id: @property ref); +has_private_keyword (int id: @property ref); +has_protected_keyword (int id: @property ref); +has_readonly_keyword (int id: @property ref); +has_type_keyword (int id: @type_keyword_operand ref); +is_optional_member (int id: @property ref); +has_definite_assignment_assertion (int id: @field_or_vardeclarator ref); +is_optional_parameter_declaration (unique int parameter: @pattern ref); + +#keyset[constructor, param_index] +parameter_fields( + unique int field: @parameter_field ref, + int constructor: @function_expr ref, + int param_index: int ref +); + +// types +#keyset[parent, idx] +typeexprs ( + unique int id: @typeexpr, + int kind: int ref, + int parent: @typeexpr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref +); + +case @typeexpr.kind of + 0 = @local_type_access +| 1 = @type_decl +| 2 = @keyword_typeexpr +| 3 = @string_literal_typeexpr +| 4 = @number_literal_typeexpr +| 5 = @boolean_literal_typeexpr +| 6 = @array_typeexpr +| 7 = @union_typeexpr +| 8 = @indexed_access_typeexpr +| 9 = @intersection_typeexpr +| 10 = @parenthesized_typeexpr +| 11 = @tuple_typeexpr +| 12 = @keyof_typeexpr +| 13 = @qualified_type_access +| 14 = @generic_typeexpr +| 15 = @type_label +| 16 = @typeof_typeexpr +| 17 = @local_var_type_access +| 18 = @qualified_var_type_access +| 19 = @this_var_type_access +| 20 = @predicate_typeexpr +| 21 = @interface_typeexpr +| 22 = @type_parameter +| 23 = @plain_function_typeexpr +| 24 = @constructor_typeexpr +| 25 = @local_namespace_access +| 26 = @qualified_namespace_access +| 27 = @mapped_typeexpr +| 28 = @conditional_typeexpr +| 29 = @infer_typeexpr +| 30 = @import_type_access +| 31 = @import_namespace_access +| 32 = @import_var_type_access +| 33 = @optional_typeexpr +| 34 = @rest_typeexpr +| 35 = @bigint_literal_typeexpr +| 36 = @readonly_typeexpr +| 37 = @template_literal_typeexpr +; + +@typeref = @typeaccess | @type_decl; +@type_identifier = @type_decl | @local_type_access | @type_label | @local_var_type_access | @local_namespace_access; +@typeexpr_parent = @expr | @stmt | @property | @typeexpr; +@literal_typeexpr = @string_literal_typeexpr | @number_literal_typeexpr | @boolean_literal_typeexpr | @bigint_literal_typeexpr; +@typeaccess = @local_type_access | @qualified_type_access | @import_type_access; +@vartypeaccess = @local_var_type_access | @qualified_var_type_access | @this_var_type_access | @import_var_type_access; +@namespace_access = @local_namespace_access | @qualified_namespace_access | @import_namespace_access; +@import_typeexpr = @import_type_access | @import_namespace_access | @import_var_type_access; + +@function_typeexpr = @plain_function_typeexpr | @constructor_typeexpr; + +// types +types ( + unique int id: @type, + int kind: int ref, + varchar(900) tostring: string ref +); + +#keyset[parent, idx] +type_child ( + int child: @type ref, + int parent: @type ref, + int idx: int ref +); + +case @type.kind of + 0 = @any_type +| 1 = @string_type +| 2 = @number_type +| 3 = @union_type +| 4 = @true_type +| 5 = @false_type +| 6 = @type_reference +| 7 = @object_type +| 8 = @canonical_type_variable_type +| 9 = @typeof_type +| 10 = @void_type +| 11 = @undefined_type +| 12 = @null_type +| 13 = @never_type +| 14 = @plain_symbol_type +| 15 = @unique_symbol_type +| 16 = @objectkeyword_type +| 17 = @intersection_type +| 18 = @tuple_type +| 19 = @lexical_type_variable_type +| 20 = @this_type +| 21 = @number_literal_type +| 22 = @string_literal_type +| 23 = @unknown_type +| 24 = @bigint_type +| 25 = @bigint_literal_type +; + +@boolean_literal_type = @true_type | @false_type; +@symbol_type = @plain_symbol_type | @unique_symbol_type; +@union_or_intersection_type = @union_type | @intersection_type; +@typevariable_type = @canonical_type_variable_type | @lexical_type_variable_type; + +has_asserts_keyword(int node: @predicate_typeexpr ref); + +@typed_ast_node = @expr | @typeexpr | @function; +ast_node_type( + unique int node: @typed_ast_node ref, + int typ: @type ref); + +declared_function_signature( + unique int node: @function ref, + int sig: @signature_type ref +); + +invoke_expr_signature( + unique int node: @invokeexpr ref, + int sig: @signature_type ref +); + +invoke_expr_overload_index( + unique int node: @invokeexpr ref, + int index: int ref +); + +symbols ( + unique int id: @symbol, + int kind: int ref, + varchar(900) name: string ref +); + +symbol_parent ( + unique int symbol: @symbol ref, + int parent: @symbol ref +); + +symbol_module ( + int symbol: @symbol ref, + varchar(900) moduleName: string ref +); + +symbol_global ( + int symbol: @symbol ref, + varchar(900) globalName: string ref +); + +case @symbol.kind of + 0 = @root_symbol +| 1 = @member_symbol +| 2 = @other_symbol +; + +@type_with_symbol = @type_reference | @typevariable_type | @typeof_type | @unique_symbol_type; +@ast_node_with_symbol = @type_definition | @namespace_definition | @toplevel | @typeaccess | @namespace_access | @var_decl | @function | @invokeexpr | @import_declaration | @external_module_reference | @external_module_declaration; + +ast_node_symbol( + unique int node: @ast_node_with_symbol ref, + int symbol: @symbol ref); + +type_symbol( + unique int typ: @type_with_symbol ref, + int symbol: @symbol ref); + +#keyset[typ, name] +type_property( + int typ: @type ref, + varchar(900) name: string ref, + int propertyType: @type ref); + +type_alias( + unique int aliasType: @type ref, + int underlyingType: @type ref); + +@literal_type = @string_literal_type | @number_literal_type | @boolean_literal_type | @bigint_literal_type; +@type_with_literal_value = @string_literal_type | @number_literal_type | @bigint_literal_type; +type_literal_value( + unique int typ: @type_with_literal_value ref, + varchar(900) value: string ref); + +signature_types ( + unique int id: @signature_type, + int kind: int ref, + varchar(900) tostring: string ref, + int type_parameters: int ref, + int required_params: int ref +); + +is_abstract_signature( + unique int sig: @signature_type ref +); + +signature_rest_parameter( + unique int sig: @signature_type ref, + int rest_param_arra_type: @type ref +); + +case @signature_type.kind of + 0 = @function_signature_type +| 1 = @constructor_signature_type +; + +#keyset[typ, kind, index] +type_contains_signature ( + int typ: @type ref, + int kind: int ref, // constructor/call/index + int index: int ref, // ordering of overloaded signatures + int sig: @signature_type ref +); + +#keyset[parent, index] +signature_contains_type ( + int child: @type ref, + int parent: @signature_type ref, + int index: int ref +); + +#keyset[sig, index] +signature_parameter_name ( + int sig: @signature_type ref, + int index: int ref, + varchar(900) name: string ref +); + +number_index_type ( + unique int baseType: @type ref, + int propertyType: @type ref +); + +string_index_type ( + unique int baseType: @type ref, + int propertyType: @type ref +); + +base_type_names( + int typeName: @symbol ref, + int baseTypeName: @symbol ref +); + +self_types( + int typeName: @symbol ref, + int selfType: @type_reference ref +); + +tuple_type_min_length( + unique int typ: @type ref, + int minLength: int ref +); + +tuple_type_rest_index( + unique int typ: @type ref, + int index: int ref +); + +// comments +comments (unique int id: @comment, + int kind: int ref, + int toplevel: @toplevel ref, + varchar(900) text: string ref, + varchar(900) tostring: string ref); + +case @comment.kind of + 0 = @slashslash_comment +| 1 = @slashstar_comment +| 2 = @doc_comment +| 3 = @html_comment_start +| 4 = @htmlcommentend; + +@html_comment = @html_comment_start | @htmlcommentend; +@line_comment = @slashslash_comment | @html_comment; +@block_comment = @slashstar_comment | @doc_comment; + +// source lines +lines (unique int id: @line, + int toplevel: @toplevel ref, + varchar(900) text: string ref, + varchar(2) terminator: string ref); +indentation (int file: @file ref, + int lineno: int ref, + varchar(1) indentChar: string ref, + int indentDepth: int ref); + +// JavaScript parse errors +js_parse_errors (unique int id: @js_parse_error, + int toplevel: @toplevel ref, + varchar(900) message: string ref, + varchar(900) line: string ref); + +// regular expressions +#keyset[parent, idx] +regexpterm (unique int id: @regexpterm, + int kind: int ref, + int parent: @regexpparent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +@regexpparent = @regexpterm | @regexp_literal | @string_literal | @add_expr; + +case @regexpterm.kind of + 0 = @regexp_alt +| 1 = @regexp_seq +| 2 = @regexp_caret +| 3 = @regexp_dollar +| 4 = @regexp_wordboundary +| 5 = @regexp_nonwordboundary +| 6 = @regexp_positive_lookahead +| 7 = @regexp_negative_lookahead +| 8 = @regexp_star +| 9 = @regexp_plus +| 10 = @regexp_opt +| 11 = @regexp_range +| 12 = @regexp_dot +| 13 = @regexp_group +| 14 = @regexp_normal_constant +| 15 = @regexp_hex_escape +| 16 = @regexp_unicode_escape +| 17 = @regexp_dec_escape +| 18 = @regexp_oct_escape +| 19 = @regexp_ctrl_escape +| 20 = @regexp_char_class_escape +| 21 = @regexp_id_escape +| 22 = @regexp_backref +| 23 = @regexp_char_class +| 24 = @regexp_char_range +| 25 = @regexp_positive_lookbehind +| 26 = @regexp_negative_lookbehind +| 27 = @regexp_unicode_property_escape +| 28 = @regexp_quoted_string +| 29 = @regexp_intersection +| 30 = @regexp_subtraction; + +regexp_parse_errors (unique int id: @regexp_parse_error, + int regexp: @regexpterm ref, + varchar(900) message: string ref); + +@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range; +@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape; +@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape; +@regexp_constant = @regexp_normal_constant | @regexp_char_escape; +@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead; +@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind; +@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind; +@regexp_anchor = @regexp_dollar | @regexp_caret; + +is_greedy (int id: @regexp_quantifier ref); +range_quantifier_lower_bound (unique int id: @regexp_range ref, int lo: int ref); +range_quantifier_upper_bound (unique int id: @regexp_range ref, int hi: int ref); +is_capture (unique int id: @regexp_group ref, int number: int ref); +is_named_capture (unique int id: @regexp_group ref, string name: string ref); +is_inverted (int id: @regexp_char_class ref); +regexp_const_value (unique int id: @regexp_constant ref, varchar(1) value: string ref); +char_class_escape (unique int id: @regexp_char_class_escape ref, varchar(1) value: string ref); +backref (unique int id: @regexp_backref ref, int value: int ref); +named_backref (unique int id: @regexp_backref ref, string name: string ref); +unicode_property_escapename (unique int id: @regexp_unicode_property_escape ref, string name: string ref); +unicode_property_escapevalue (unique int id: @regexp_unicode_property_escape ref, string value: string ref); + +// tokens +#keyset[toplevel, idx] +tokeninfo (unique int id: @token, + int kind: int ref, + int toplevel: @toplevel ref, + int idx: int ref, + varchar(900) value: string ref); + +case @token.kind of + 0 = @token_eof +| 1 = @token_null_literal +| 2 = @token_boolean_literal +| 3 = @token_numeric_literal +| 4 = @token_string_literal +| 5 = @token_regular_expression +| 6 = @token_identifier +| 7 = @token_keyword +| 8 = @token_punctuator; + +// associate comments with the token immediately following them (which may be EOF) +next_token (int comment: @comment ref, int token: @token ref); + +// JSON +#keyset[parent, idx] +json (unique int id: @json_value, + int kind: int ref, + int parent: @json_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +json_literals (varchar(900) value: string ref, + varchar(900) raw: string ref, + unique int expr: @json_value ref); + +json_properties (int obj: @json_object ref, + varchar(900) property: string ref, + int value: @json_value ref); + +json_errors (unique int id: @json_parse_error, + varchar(900) message: string ref); + +json_locations(unique int locatable: @json_locatable ref, + int location: @location_default ref); + +case @json_value.kind of + 0 = @json_null +| 1 = @json_boolean +| 2 = @json_number +| 3 = @json_string +| 4 = @json_array +| 5 = @json_object; + +@json_parent = @json_object | @json_array | @file; + +@json_locatable = @json_value | @json_parse_error; + +// locations +@ast_node = @toplevel | @stmt | @expr | @property | @typeexpr; + +@locatable = @file + | @ast_node + | @comment + | @line + | @js_parse_error | @regexp_parse_error + | @regexpterm + | @json_locatable + | @token + | @cfg_node + | @jsdoc | @jsdoc_type_expr | @jsdoc_tag + | @yaml_locatable + | @xmllocatable + | @configLocatable + | @template_placeholder_tag; + +hasLocation (unique int locatable: @locatable ref, + int location: @location ref); + +// CFG +entry_cfg_node (unique int id: @entry_node, int container: @stmt_container ref); +exit_cfg_node (unique int id: @exit_node, int container: @stmt_container ref); +guard_node (unique int id: @guard_node, int kind: int ref, int test: @expr ref); +case @guard_node.kind of + 0 = @falsy_guard +| 1 = @truthy_guard; +@condition_guard = @falsy_guard | @truthy_guard; + +@synthetic_cfg_node = @entry_node | @exit_node | @guard_node; +@cfg_node = @synthetic_cfg_node | @expr_parent; + +successor (int pred: @cfg_node ref, int succ: @cfg_node ref); + +// JSDoc comments +jsdoc (unique int id: @jsdoc, varchar(900) description: string ref, int comment: @comment ref); +#keyset[parent, idx] +jsdoc_tags (unique int id: @jsdoc_tag, varchar(900) title: string ref, + int parent: @jsdoc ref, int idx: int ref, varchar(900) tostring: string ref); +jsdoc_tag_descriptions (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref); +jsdoc_tag_names (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref); + +#keyset[parent, idx] +jsdoc_type_exprs (unique int id: @jsdoc_type_expr, + int kind: int ref, + int parent: @jsdoc_type_expr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); +case @jsdoc_type_expr.kind of + 0 = @jsdoc_any_type_expr +| 1 = @jsdoc_null_type_expr +| 2 = @jsdoc_undefined_type_expr +| 3 = @jsdoc_unknown_type_expr +| 4 = @jsdoc_void_type_expr +| 5 = @jsdoc_identifier_type_expr +| 6 = @jsdoc_applied_type_expr +| 7 = @jsdoc_nullable_type_expr +| 8 = @jsdoc_non_nullable_type_expr +| 9 = @jsdoc_record_type_expr +| 10 = @jsdoc_array_type_expr +| 11 = @jsdoc_union_type_expr +| 12 = @jsdoc_function_type_expr +| 13 = @jsdoc_optional_type_expr +| 14 = @jsdoc_rest_type_expr +| 15 = @jsdoc_qualified_type_expr +; + +#keyset[id, idx] +jsdoc_record_field_name (int id: @jsdoc_record_type_expr ref, int idx: int ref, varchar(900) name: string ref); +jsdoc_prefix_qualifier (int id: @jsdoc_type_expr ref); +jsdoc_has_new_parameter (int fn: @jsdoc_function_type_expr ref); + +@jsdoc_type_expr_parent = @jsdoc_type_expr | @jsdoc_tag; + +jsdoc_errors (unique int id: @jsdoc_error, int tag: @jsdoc_tag ref, varchar(900) message: string ref, varchar(900) tostring: string ref); + +@dataflownode = @expr | @function_decl_stmt | @class_decl_stmt | @namespace_declaration | @enum_declaration | @property; + +@optionalchainable = @call_expr | @propaccess; + +isOptionalChaining(int id: @optionalchainable ref); + +/** + * The time taken for the extraction of a file. + * This table contains non-deterministic content. + * + * The sum of the `time` column for each (`file`, `timerKind`) pair + * is the total time taken for extraction of `file`. The `extractionPhase` + * column provides a granular view of the extraction time of the file. + */ +extraction_time( + int file : @file ref, + // see `com.semmle.js.extractor.ExtractionMetrics.ExtractionPhase`. + int extractionPhase: int ref, + // 0 for the elapsed CPU time in nanoseconds, 1 for the elapsed wallclock time in nanoseconds + int timerKind: int ref, + float time: float ref +) + +/** +* Non-timing related data for the extraction of a single file. +* This table contains non-deterministic content. +*/ +extraction_data( + int file : @file ref, + // the absolute path to the cache file + varchar(900) cacheFile: string ref, + boolean fromCache: boolean ref, + int length: int ref +) + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- 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; + +/*- Configuration files with key value pairs -*/ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); diff --git a/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/upgrade.properties b/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/upgrade.properties new file mode 100644 index 000000000000..6ebac3d9a45d --- /dev/null +++ b/javascript/downgrades/80b2bc24189307c5fd178dc2da95b45bcdb117f7/upgrade.properties @@ -0,0 +1,4 @@ +description: add support for deferred imports +compatibility: partial + +has_defer_keyword.rel: delete diff --git a/javascript/extractor/lib/typescript/package-lock.json b/javascript/extractor/lib/typescript/package-lock.json index 389cc1d2a5b8..68923719ff8d 100644 --- a/javascript/extractor/lib/typescript/package-lock.json +++ b/javascript/extractor/lib/typescript/package-lock.json @@ -6,24 +6,25 @@ "": { "name": "typescript-parser-wrapper", "dependencies": { - "typescript": "^5.8.2" + "typescript": "5.9" }, "devDependencies": { - "@types/node": "18.15.3" + "@types/node": "^24.3.1" } }, "node_modules/@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==", + "version": "24.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", + "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", "dev": true, - "license": "MIT" + "dependencies": { + "undici-types": "~7.10.0" + } }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "license": "Apache-2.0", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -31,6 +32,12 @@ "engines": { "node": ">=14.17" } + }, + "node_modules/undici-types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true } } } diff --git a/javascript/extractor/lib/typescript/package.json b/javascript/extractor/lib/typescript/package.json index 7e0c5fd160d0..f23f197e870b 100644 --- a/javascript/extractor/lib/typescript/package.json +++ b/javascript/extractor/lib/typescript/package.json @@ -2,7 +2,7 @@ "name": "typescript-parser-wrapper", "private": true, "dependencies": { - "typescript": "^5.8.2" + "typescript": "5.9" }, "scripts": { "build": "tsc --project tsconfig.json", @@ -12,6 +12,6 @@ "watch": "tsc -p . -w --sourceMap" }, "devDependencies": { - "@types/node": "18.15.3" + "@types/node": "^24.3.1" } } diff --git a/javascript/extractor/lib/typescript/src/main.ts b/javascript/extractor/lib/typescript/src/main.ts index aa69642e04be..0630213c7431 100644 --- a/javascript/extractor/lib/typescript/src/main.ts +++ b/javascript/extractor/lib/typescript/src/main.ts @@ -267,6 +267,7 @@ const astProperties: string[] = [ "parameterName", "parameters", "parseDiagnostics", + "phaseModifier", "properties", "propertyName", "qualifier", diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index 9c2eeb9e2411..63f49e148911 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -61,6 +61,7 @@ import com.semmle.js.ast.ImportDeclaration; import com.semmle.js.ast.ImportDefaultSpecifier; import com.semmle.js.ast.ImportNamespaceSpecifier; +import com.semmle.js.ast.ImportPhaseModifier; import com.semmle.js.ast.ImportSpecifier; import com.semmle.js.ast.LabeledStatement; import com.semmle.js.ast.Literal; @@ -3587,6 +3588,7 @@ protected Expression parseImportOrExportAttributesAndSemicolon() { } protected ImportDeclaration parseImportRest(SourceLocation loc) { + ImportPhaseModifier[] phaseModifier = { ImportPhaseModifier.NONE }; List specifiers; Literal source; // import '...' @@ -3594,27 +3596,32 @@ protected ImportDeclaration parseImportRest(SourceLocation loc) { specifiers = new ArrayList(); source = (Literal) this.parseExprAtom(null); } else { - specifiers = this.parseImportSpecifiers(); + specifiers = this.parseImportSpecifiers(phaseModifier); this.expectContextual("from"); if (this.type != TokenType.string) this.unexpected(); source = (Literal) this.parseExprAtom(null); } Expression attributes = this.parseImportOrExportAttributesAndSemicolon(); if (specifiers == null) return null; - return this.finishNode(new ImportDeclaration(loc, specifiers, source, attributes)); + return this.finishNode(new ImportDeclaration(loc, specifiers, source, attributes, phaseModifier[0])); } // Parses a comma-separated list of module imports. - protected List parseImportSpecifiers() { + protected List parseImportSpecifiers(ImportPhaseModifier[] phaseModifier) { List nodes = new ArrayList(); boolean first = true; if (this.type == TokenType.name) { // import defaultObj, { x, y as z } from '...' SourceLocation loc = new SourceLocation(this.startLoc); Identifier local = this.parseIdent(false); - this.checkLVal(local, true, null); - nodes.add(this.finishNode(new ImportDefaultSpecifier(loc, local))); - if (!this.eat(TokenType.comma)) return nodes; + // Parse `import defer *` as the beginning of a deferred import, instead of a default import specifier + if (this.type == TokenType.star && local.getName().equals("defer")) { + phaseModifier[0] = ImportPhaseModifier.DEFER; + } else { + this.checkLVal(local, true, null); + nodes.add(this.finishNode(new ImportDefaultSpecifier(loc, local))); + if (!this.eat(TokenType.comma)) return nodes; + } } if (this.type == TokenType.star) { SourceLocation loc = new SourceLocation(this.startLoc); @@ -3647,7 +3654,7 @@ protected ImportSpecifier parseImportSpecifier() { if (this.type == TokenType.string) { // Arbitrary Module Namespace Identifiers // e.g. `import { "Foo::new" as Foo_new } from "./foo.wasm"` - Expression string = this.parseExprAtom(null); + Expression string = this.parseExprAtom(null); String str = ((Literal)string).getStringValue(); imported = this.finishNode(new Identifier(loc, str)); // only makes sense if there is a local identifier diff --git a/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java b/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java index 1213c15d99f3..cb2dad0f978a 100644 --- a/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java +++ b/javascript/extractor/src/com/semmle/jcorn/flow/FlowParser.java @@ -14,6 +14,7 @@ import com.semmle.js.ast.ExpressionStatement; import com.semmle.js.ast.FieldDefinition; import com.semmle.js.ast.Identifier; +import com.semmle.js.ast.ImportPhaseModifier; import com.semmle.js.ast.ImportSpecifier; import com.semmle.js.ast.Literal; import com.semmle.js.ast.MethodDefinition; @@ -1064,13 +1065,13 @@ private String peekAtSpecialFlowImportSpecifier() { } @Override - protected List parseImportSpecifiers() { + protected List parseImportSpecifiers(ImportPhaseModifier[] phaseModifier) { String kind = null; if (flow()) { kind = flowParseImportSpecifiers(); } - List specs = super.parseImportSpecifiers(); + List specs = super.parseImportSpecifiers(phaseModifier); if (kind != null || specs.isEmpty()) return null; return specs; } diff --git a/javascript/extractor/src/com/semmle/js/ast/ImportDeclaration.java b/javascript/extractor/src/com/semmle/js/ast/ImportDeclaration.java index e672afcb4711..86f8743b9e4a 100644 --- a/javascript/extractor/src/com/semmle/js/ast/ImportDeclaration.java +++ b/javascript/extractor/src/com/semmle/js/ast/ImportDeclaration.java @@ -26,11 +26,11 @@ public class ImportDeclaration extends Statement implements INodeWithSymbol { private int symbol = -1; - private boolean hasTypeKeyword; + private ImportPhaseModifier phaseModifier; public ImportDeclaration( SourceLocation loc, List specifiers, Literal source, Expression attributes) { - this(loc, specifiers, source, attributes, false); + this(loc, specifiers, source, attributes, ImportPhaseModifier.NONE); } public ImportDeclaration( @@ -38,12 +38,12 @@ public ImportDeclaration( List specifiers, Literal source, Expression attributes, - boolean hasTypeKeyword) { + ImportPhaseModifier phaseModifier) { super("ImportDeclaration", loc); this.specifiers = specifiers; this.source = source; this.attributes = attributes; - this.hasTypeKeyword = hasTypeKeyword; + this.phaseModifier = phaseModifier; } public Literal getSource() { @@ -79,6 +79,15 @@ public void setSymbol(int symbol) { /** Returns true if this is an import type declaration. */ public boolean hasTypeKeyword() { - return hasTypeKeyword; + return phaseModifier == ImportPhaseModifier.TYPE; + } + + /** Returns true if this is an import defer declaration. */ + public boolean hasDeferKeyword() { + return phaseModifier == ImportPhaseModifier.DEFER; + } + + public ImportPhaseModifier getPhaseModifier() { + return phaseModifier; } } diff --git a/javascript/extractor/src/com/semmle/js/ast/ImportPhaseModifier.java b/javascript/extractor/src/com/semmle/js/ast/ImportPhaseModifier.java new file mode 100644 index 000000000000..40777b23b609 --- /dev/null +++ b/javascript/extractor/src/com/semmle/js/ast/ImportPhaseModifier.java @@ -0,0 +1,10 @@ +package com.semmle.js.ast; + +/** + * A keyword that may appear on import declarations. + */ +public enum ImportPhaseModifier { + NONE, + DEFER, + TYPE, +} diff --git a/javascript/extractor/src/com/semmle/js/ast/NodeCopier.java b/javascript/extractor/src/com/semmle/js/ast/NodeCopier.java index c216e0c11852..ae5676950df9 100644 --- a/javascript/extractor/src/com/semmle/js/ast/NodeCopier.java +++ b/javascript/extractor/src/com/semmle/js/ast/NodeCopier.java @@ -564,7 +564,7 @@ public ImportDeclaration visit(ImportDeclaration nd, Void c) { copy(nd.getSpecifiers()), copy(nd.getSource()), copy(nd.getAttributes()), - nd.hasTypeKeyword()); + nd.getPhaseModifier()); } @Override diff --git a/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java b/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java index 5625a9f1211c..a2f006e32395 100644 --- a/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java +++ b/javascript/extractor/src/com/semmle/js/extractor/ASTExtractor.java @@ -1833,6 +1833,9 @@ public Label visit(ImportDeclaration nd, Context c) { if (nd.hasTypeKeyword()) { trapwriter.addTuple("has_type_keyword", lbl); } + if (nd.hasDeferKeyword()) { + trapwriter.addTuple("has_defer_keyword", lbl); + } return lbl; } diff --git a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java index a3e031845a2a..0c013f906b2b 100644 --- a/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java +++ b/javascript/extractor/src/com/semmle/ts/extractor/TypeScriptASTConverter.java @@ -52,6 +52,7 @@ import com.semmle.js.ast.ImportDeclaration; import com.semmle.js.ast.ImportDefaultSpecifier; import com.semmle.js.ast.ImportNamespaceSpecifier; +import com.semmle.js.ast.ImportPhaseModifier; import com.semmle.js.ast.ImportSpecifier; import com.semmle.js.ast.InvokeExpression; import com.semmle.js.ast.LabeledStatement; @@ -1404,7 +1405,7 @@ private Node convertImportDeclaration(JsonObject node, SourceLocation loc) throw Literal src = tryConvertChild(node, "moduleSpecifier", Literal.class); Expression attributes = convertChild(node, "attributes"); List specifiers = new ArrayList<>(); - boolean hasTypeKeyword = false; + ImportPhaseModifier phaseModifier = ImportPhaseModifier.NONE; if (hasChild(node, "importClause")) { JsonObject importClause = node.get("importClause").getAsJsonObject(); if (hasChild(importClause, "name")) { @@ -1418,10 +1419,22 @@ private Node convertImportDeclaration(JsonObject node, SourceLocation loc) throw specifiers.addAll(convertChildren(namedBindings, "elements")); } } - hasTypeKeyword = importClause.get("isTypeOnly").getAsBoolean(); + if (hasChild(importClause, "phaseModifier")) { + String name = metadata.getSyntaxKindName(importClause.get("phaseModifier").getAsInt()); + switch (name) { + case "DeferKeyword": { + phaseModifier = ImportPhaseModifier.DEFER; + break; + } + case "TypeKeyword": { + phaseModifier = ImportPhaseModifier.TYPE; + break; + } + } + } } ImportDeclaration importDecl = - new ImportDeclaration(loc, specifiers, src, attributes, hasTypeKeyword); + new ImportDeclaration(loc, specifiers, src, attributes, phaseModifier); attachSymbolInformation(importDecl, node); return importDecl; } diff --git a/javascript/ql/integration-tests/query-suite/javascript-code-scanning.qls.expected b/javascript/ql/integration-tests/query-suite/javascript-code-scanning.qls.expected index 652ac0ebc1b9..0c417e661c79 100644 --- a/javascript/ql/integration-tests/query-suite/javascript-code-scanning.qls.expected +++ b/javascript/ql/integration-tests/query-suite/javascript-code-scanning.qls.expected @@ -83,5 +83,6 @@ ql/javascript/ql/src/Security/CWE-915/PrototypePollutingFunction.ql ql/javascript/ql/src/Security/CWE-915/PrototypePollutingMergeCall.ql ql/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.ql ql/javascript/ql/src/Security/CWE-918/RequestForgery.ql +ql/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql ql/javascript/ql/src/Summary/LinesOfCode.ql ql/javascript/ql/src/Summary/LinesOfUserCode.ql diff --git a/javascript/ql/integration-tests/query-suite/javascript-security-and-quality.qls.expected b/javascript/ql/integration-tests/query-suite/javascript-security-and-quality.qls.expected index dd5877683082..f87cd2bf505a 100644 --- a/javascript/ql/integration-tests/query-suite/javascript-security-and-quality.qls.expected +++ b/javascript/ql/integration-tests/query-suite/javascript-security-and-quality.qls.expected @@ -184,6 +184,7 @@ ql/javascript/ql/src/Security/CWE-915/PrototypePollutingMergeCall.ql ql/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.ql ql/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.ql ql/javascript/ql/src/Security/CWE-918/RequestForgery.ql +ql/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql ql/javascript/ql/src/Statements/DanglingElse.ql ql/javascript/ql/src/Statements/IgnoreArrayResult.ql ql/javascript/ql/src/Statements/InconsistentLoopOrientation.ql diff --git a/javascript/ql/integration-tests/query-suite/javascript-security-extended.qls.expected b/javascript/ql/integration-tests/query-suite/javascript-security-extended.qls.expected index 9b7cfd22ed6f..ac5e0e2c4984 100644 --- a/javascript/ql/integration-tests/query-suite/javascript-security-extended.qls.expected +++ b/javascript/ql/integration-tests/query-suite/javascript-security-extended.qls.expected @@ -99,5 +99,6 @@ ql/javascript/ql/src/Security/CWE-915/PrototypePollutingMergeCall.ql ql/javascript/ql/src/Security/CWE-916/InsufficientPasswordHash.ql ql/javascript/ql/src/Security/CWE-918/ClientSideRequestForgery.ql ql/javascript/ql/src/Security/CWE-918/RequestForgery.ql +ql/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql ql/javascript/ql/src/Summary/LinesOfCode.ql ql/javascript/ql/src/Summary/LinesOfUserCode.ql diff --git a/javascript/ql/integration-tests/query-suite/not_included_in_qls.expected b/javascript/ql/integration-tests/query-suite/not_included_in_qls.expected index 1b119f60c75e..fa52a97a4e4a 100644 --- a/javascript/ql/integration-tests/query-suite/not_included_in_qls.expected +++ b/javascript/ql/integration-tests/query-suite/not_included_in_qls.expected @@ -75,7 +75,6 @@ ql/javascript/ql/src/experimental/Security/CWE-347/decodeJwtWithoutVerificationL ql/javascript/ql/src/experimental/Security/CWE-444/InsecureHttpParser.ql ql/javascript/ql/src/experimental/Security/CWE-522-DecompressionBombs/DecompressionBombs.ql ql/javascript/ql/src/experimental/Security/CWE-918/SSRF.ql -ql/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.ql ql/javascript/ql/src/experimental/StandardLibrary/MultipleArgumentsToSetConstructor.ql ql/javascript/ql/src/experimental/heuristics/ql/src/Security/CWE-020/UntrustedDataToExternalAPI.ql ql/javascript/ql/src/experimental/heuristics/ql/src/Security/CWE-078/CommandInjection.ql diff --git a/javascript/ql/lib/CHANGELOG.md b/javascript/ql/lib/CHANGELOG.md index d45d55f6a36f..b98534e791d6 100644 --- a/javascript/ql/lib/CHANGELOG.md +++ b/javascript/ql/lib/CHANGELOG.md @@ -1,3 +1,10 @@ +## 2.6.11 + +### Minor Analysis Improvements + +* Added modeling for promisification libraries `@gar/promisify`, `es6-promisify`, `util.promisify`, `thenify-all`, `call-me-maybe`, `@google-cloud/promisify`, and `util-promisify`. +* Data flow is now tracked through promisified user-defined functions. + ## 2.6.10 ### Minor Analysis Improvements diff --git a/javascript/ql/lib/change-notes/released/2.6.11.md b/javascript/ql/lib/change-notes/released/2.6.11.md new file mode 100644 index 000000000000..b9a47cae76c5 --- /dev/null +++ b/javascript/ql/lib/change-notes/released/2.6.11.md @@ -0,0 +1,6 @@ +## 2.6.11 + +### Minor Analysis Improvements + +* Added modeling for promisification libraries `@gar/promisify`, `es6-promisify`, `util.promisify`, `thenify-all`, `call-me-maybe`, `@google-cloud/promisify`, and `util-promisify`. +* Data flow is now tracked through promisified user-defined functions. diff --git a/javascript/ql/lib/codeql-pack.release.yml b/javascript/ql/lib/codeql-pack.release.yml index aa42bd9f12ad..a31eb42966ca 100644 --- a/javascript/ql/lib/codeql-pack.release.yml +++ b/javascript/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.6.10 +lastReleaseVersion: 2.6.11 diff --git a/javascript/ql/lib/ext/apollo-server.model.yml b/javascript/ql/lib/ext/apollo-server.model.yml index ffceb6a6d5af..aa9755265b27 100644 --- a/javascript/ql/lib/ext/apollo-server.model.yml +++ b/javascript/ql/lib/ext/apollo-server.model.yml @@ -5,6 +5,13 @@ extensions: data: - ["@apollo/server", "Member[ApolloServer,ApolloServerBase].Argument[0].AnyMember.AnyMember.AnyMember.Parameter[1]", "remote"] + - addsTo: + pack: codeql/javascript-all + extensible: sinkModel + data: + - ["@apollo/server", "Member[gql].Argument[0]", "sql-injection"] + - ["@apollo/server", "Member[ApolloServer,ApolloServerBase].Argument[0].Member[cors].Member[origin]", "cors-origin"] + - addsTo: pack: codeql/javascript-all extensible: typeModel @@ -13,3 +20,9 @@ extensions: - ["@apollo/server", "apollo-server-express", ""] - ["@apollo/server", "apollo-server-core", ""] - ["@apollo/server", "apollo-server", ""] + - ["@apollo/server", "@apollo/apollo-server-express", ""] + - ["@apollo/server", "apollo-server-express", ""] + - ["@apollo/server", "@apollo/server", ""] + - ["@apollo/server", "@apollo/apollo-server-core", ""] + - ["ApolloServer", "@apollo/server", "Member[ApolloServer]"] + - ["GraphQLApollo", "@apollo/server", "Member[gql]"] diff --git a/javascript/ql/lib/ext/call-me-maybe.model.yml b/javascript/ql/lib/ext/call-me-maybe.model.yml new file mode 100644 index 000000000000..ceda3e8b0922 --- /dev/null +++ b/javascript/ql/lib/ext/call-me-maybe.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/javascript-all + extensible: summaryModel + data: + - ["call-me-maybe", "", "Argument[1]", "ReturnValue", "value"] diff --git a/javascript/ql/lib/ext/cors.model.yml b/javascript/ql/lib/ext/cors.model.yml new file mode 100644 index 000000000000..31125d454b9b --- /dev/null +++ b/javascript/ql/lib/ext/cors.model.yml @@ -0,0 +1,6 @@ +extensions: + - addsTo: + pack: codeql/javascript-all + extensible: sinkModel + data: + - ["cors", "Argument[0].Member[origin]", "cors-origin"] diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index f4d61d54235b..3656daac7b72 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.6.10 +version: 2.6.11 groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/lib/semmle/javascript/ApiGraphs.qll b/javascript/ql/lib/semmle/javascript/ApiGraphs.qll index 3bb04f2686be..850e92244512 100644 --- a/javascript/ql/lib/semmle/javascript/ApiGraphs.qll +++ b/javascript/ql/lib/semmle/javascript/ApiGraphs.qll @@ -822,7 +822,7 @@ module API { or // special case: from `require('m')` to an export of `prop` in `m` exists(Import imp, Module m, string prop | - pred = imp.getImportedModuleNode() and + pred = imp.getImportedModuleNodeStrict() and m = imp.getImportedModule() and lbl = Label::member(prop) and rhs = m.getAnExportedValue(prop) @@ -1115,6 +1115,17 @@ module API { ref = awaited(call) ) or + // Handle promisified object member access: promisify(obj).member should be treated as obj.member (promisified) + exists( + Promisify::PromisifyAllCall promisifiedObj, DataFlow::SourceNode originalObj, + string member + | + originalObj.flowsTo(promisifiedObj.getArgument(0)) and + use(base, originalObj) and + lbl = Label::member(member) and + ref = promisifiedObj.getAPropertyRead(member) + ) + or decoratorDualEdge(base, lbl, ref) or decoratorUseEdge(base, lbl, ref) @@ -1337,7 +1348,7 @@ module API { result = nd.getALocalSource() or // additional backwards step from `require('m')` to `exports` or `module.exports` in m - exists(Import imp | imp.getImportedModuleNode() = trackDefNode(nd, t.continue()) | + exists(Import imp | imp.getImportedModuleNodeStrict() = trackDefNode(nd, t.continue()) | result = DataFlow::exportsVarNode(imp.getImportedModule()) or result = DataFlow::moduleVarNode(imp.getImportedModule()).getAPropertyRead("exports") diff --git a/javascript/ql/lib/semmle/javascript/ES2015Modules.qll b/javascript/ql/lib/semmle/javascript/ES2015Modules.qll index e7534449f55b..e584697c1e44 100644 --- a/javascript/ql/lib/semmle/javascript/ES2015Modules.qll +++ b/javascript/ql/lib/semmle/javascript/ES2015Modules.qll @@ -137,20 +137,37 @@ class ImportDeclaration extends Stmt, Import, @import_declaration { is instanceof ImportNamespaceSpecifier and count(this.getASpecifier()) = 1 or - // For compatibility with the non-standard implementation of default imports, - // treat default imports as namespace imports in cases where it can't cause ambiguity - // between named exports and the properties of a default-exported object. - not this.getImportedModule().(ES2015Module).hasBothNamedAndDefaultExports() and - is.getImportedName() = "default" + result = this.getAmbiguousDefaultImportNode() ) or // `import { createServer } from 'http'` result = DataFlow::destructuredModuleImportNode(this) } + /** + * Gets the data flow node corresponding to the `foo` in `import foo from "somewhere"`. + * + * This refers to the default import, but some non-standard compilers will treat it as a namespace + * import. In order to support both interpretations, it is considered an "ambiguous default import". + * + * Note that renamed default imports, such as `import { default as foo } from "somewhere"`, + * are not considered ambiguous, and will not be reported by this predicate. + */ + DataFlow::Node getAmbiguousDefaultImportNode() { + result = DataFlow::valueNode(this.getASpecifier().(ImportDefaultSpecifier)) + } + /** Holds if this is declared with the `type` keyword, so it only imports types. */ predicate isTypeOnly() { has_type_keyword(this) } + /** + * Holds if this is declared with the `defer` keyword, for example: + * ```ts + * import defer * as f from "somewhere"; + * ``` + */ + predicate isDeferredImport() { has_defer_keyword(this) } + override string getAPrimaryQlClass() { result = "ImportDeclaration" } } diff --git a/javascript/ql/lib/semmle/javascript/Modules.qll b/javascript/ql/lib/semmle/javascript/Modules.qll index 3ddd5132d05d..8b0330b708ba 100644 --- a/javascript/ql/lib/semmle/javascript/Modules.qll +++ b/javascript/ql/lib/semmle/javascript/Modules.qll @@ -179,7 +179,42 @@ abstract class Import extends AstNode { } /** - * Gets the data flow node that the default import of this import is available at. + * Gets the data flow node corresponding to the imported module. + * + * For example: + * ```js + * // ES2015 style + * import * as foo from "fs"; // Gets the node for `foo` + * import { readSync } from "fs"; // Gets a node representing the destructured import + * + * // CommonJS style + * require("fs"); // Gets the return value + * + * // AMD style + * define(["fs"], function(fs) { // Gets the node for the `fs` parameter + * }); + * ``` + * + * For default imports, this gets two nodes: the default import node, and a node representing the imported module: + * ```js + * import foo from "fs"; // gets both `foo` and a node representing the imported module + * ``` + * This behaviour is to support non-standard compilers that treat default imports + * as namespace imports. Use `getImportedModuleNodeStrict()` to avoid this behaviour in cases + * where it would cause ambiguous data flow. */ abstract DataFlow::Node getImportedModuleNode(); + + /** + * Gets the same as `getImportedModuleNode()` except ambiguous default imports are excluded + * in cases where it would cause ambiguity between named exports and properties + * of a default export. + */ + final DataFlow::Node getImportedModuleNodeStrict() { + result = this.getImportedModuleNode() and + not ( + result = this.(ImportDeclaration).getAmbiguousDefaultImportNode() and + this.getImportedModule().(ES2015Module).hasBothNamedAndDefaultExports() + ) + } } diff --git a/javascript/ql/lib/semmle/javascript/Promises.qll b/javascript/ql/lib/semmle/javascript/Promises.qll index 51411463efc6..2feb92e2e553 100644 --- a/javascript/ql/lib/semmle/javascript/Promises.qll +++ b/javascript/ql/lib/semmle/javascript/Promises.qll @@ -727,8 +727,12 @@ module Promisify { PromisifyAllCall() { this = [ - DataFlow::moduleMember("bluebird", "promisifyAll"), - DataFlow::moduleImport(["util-promisifyall", "pify"]) + DataFlow::moduleMember(["bluebird", "@google-cloud/promisify", "es6-promisify"], + "promisifyAll"), + DataFlow::moduleMember("thenify-all", "withCallback"), + DataFlow::moduleImport([ + "util-promisifyall", "pify", "thenify-all", "@gar/promisify", "util.promisify-all" + ]) ].getACall() } } @@ -741,11 +745,13 @@ module Promisify { PromisifyCall() { this = DataFlow::moduleImport(["util", "bluebird"]).getAMemberCall("promisify") or - this = DataFlow::moduleImport(["pify", "util.promisify"]).getACall() + this = DataFlow::moduleImport(["pify", "util.promisify", "util-promisify"]).getACall() or - this = DataFlow::moduleImport("thenify").getACall() + this = DataFlow::moduleImport(["thenify", "@gar/promisify", "es6-promisify"]).getACall() or this = DataFlow::moduleMember("thenify", "withCallback").getACall() + or + this = DataFlow::moduleMember("@google-cloud/promisify", "promisify").getACall() } } } diff --git a/javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll b/javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll index b36bee312239..3d5308eabf51 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/DataFlow.qll @@ -192,26 +192,6 @@ module DataFlow { FlowSteps::identityFunctionStep(result, this) } - /** - * Gets the type annotation describing the type of this node, - * provided that a static type could not be found. - * - * Doesn't take field types and function return types into account. - */ - private TypeAnnotation getFallbackTypeAnnotation() { - exists(BindingPattern pattern | - this = valueNode(pattern) and - result = pattern.getTypeAnnotation() - ) - or - result = this.getAPredecessor().getFallbackTypeAnnotation() - or - exists(DataFlow::ClassNode cls, string fieldName | - this = cls.getAReceiverNode().getAPropertyRead(fieldName) and - result = cls.getFieldTypeAnnotation(fieldName) - ) - } - private NameResolution::Node getNameResolutionNode() { this = valueNode(result) or @@ -1932,6 +1912,7 @@ module DataFlow { import Configuration import TypeTracking import AdditionalFlowSteps + import PromisifyFlow import internal.FunctionWrapperSteps import internal.sharedlib.DataFlow import internal.BarrierGuards diff --git a/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll b/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll index c4a6e12b2104..eb7160683a76 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/FlowSummary.qll @@ -17,10 +17,10 @@ private import semmle.javascript.dataflow.internal.DataFlowPrivate * * - The relevant call sites cannot be matched by the access path syntax, and require the full power of CodeQL. * For example, complex overloading patterns might require more local reasoning at the call site. - * - The input/output behaviour cannot be described statically in the access path syntax, but the relevant access paths + * - The input/output behavior cannot be described statically in the access path syntax, but the relevant access paths * can be generated dynamically in CodeQL, based on the usages found in the codebase. * - * Subclasses should bind `this` to a unique identifier for the function being modelled. There is no special + * Subclasses should bind `this` to a unique identifier for the function being modeled. There is no special * interpreation of the `this` value, it should just not clash with the `this`-value used by other classes. * * For example, this models flow through calls such as `require("my-library").myFunction()`: diff --git a/javascript/ql/lib/semmle/javascript/dataflow/Portals.qll b/javascript/ql/lib/semmle/javascript/dataflow/Portals.qll index a325a5e14f75..d8f29c707a60 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/Portals.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/Portals.qll @@ -11,6 +11,7 @@ * * The API of this library is not stable yet and may change. */ +deprecated module; import javascript diff --git a/javascript/ql/lib/semmle/javascript/dataflow/PromisifyFlow.qll b/javascript/ql/lib/semmle/javascript/dataflow/PromisifyFlow.qll new file mode 100644 index 000000000000..4389a3d031a6 --- /dev/null +++ b/javascript/ql/lib/semmle/javascript/dataflow/PromisifyFlow.qll @@ -0,0 +1,29 @@ +/** + * Provides data flow steps for promisified user-defined function calls. + * This ensures that when you call a promisified user-defined function, + * arguments flow to the original function's parameters. + */ + +private import javascript +private import semmle.javascript.dataflow.AdditionalFlowSteps + +/** + * A data flow step from arguments of promisified user-defined function calls to + * the parameters of the original function. + */ +class PromisifiedUserFunctionArgumentFlow extends AdditionalFlowStep { + override predicate step(DataFlow::Node pred, DataFlow::Node succ) { + exists( + DataFlow::CallNode promisifiedCall, Promisify::PromisifyCall promisify, + DataFlow::FunctionNode originalFunc, int i + | + // The promisified call flows from a promisify result + promisify.flowsTo(promisifiedCall.getCalleeNode()) and + // The original function was promisified + originalFunc.flowsTo(promisify.getArgument(0)) and + // Argument i of the promisified call flows to parameter i of the original function + pred = promisifiedCall.getArgument(i) and + succ = originalFunc.getParameter(i) + ) + } +} diff --git a/javascript/ql/lib/semmle/javascript/dataflow/Sources.qll b/javascript/ql/lib/semmle/javascript/dataflow/Sources.qll index f861488a046c..7503e5001e0f 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/Sources.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/Sources.qll @@ -334,6 +334,7 @@ module SourceNode { astNode instanceof Templating::PipeRefExpr or astNode instanceof Templating::TemplateVarRefExpr or astNode instanceof StringLiteral or + astNode instanceof TemplateLiteral or astNode instanceof TypeAssertion or astNode instanceof SatisfiesExpr ) diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll index 974bc20bc89d..39c4b604fd7d 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/BarrierGuards.qll @@ -386,34 +386,35 @@ module MakeStateBarrierGuard< */ private class BarrierGuardFunction extends FinalFunction { DataFlow::ParameterNode sanitizedParameter; - BarrierGuard guard; boolean guardOutcome; FlowState state; int paramIndex; BarrierGuardFunction() { - barrierGuardIsRelevant(guard) and - exists(Expr e | - exists(Expr returnExpr | - returnExpr = guard.asExpr() - or - // ad hoc support for conjunctions: - getALogicalAndParent(guard) = returnExpr and guardOutcome = true - or - // ad hoc support for disjunctions: - getALogicalOrParent(guard) = returnExpr and guardOutcome = false - | - exists(SsaExplicitDefinition ssa | - ssa.getDef().getSource() = returnExpr and - ssa.getVariable().getAUse() = this.getAReturnedExpr() - ) - or - returnExpr = this.getAReturnedExpr() + exists(BarrierGuard guard | + barrierGuardIsRelevant(guard) and + exists(Expr e | + exists(Expr returnExpr | + returnExpr = guard.asExpr() + or + // ad hoc support for conjunctions: + getALogicalAndParent(guard) = returnExpr and guardOutcome = true + or + // ad hoc support for disjunctions: + getALogicalOrParent(guard) = returnExpr and guardOutcome = false + | + exists(SsaExplicitDefinition ssa | + ssa.getDef().getSource() = returnExpr and + ssa.getVariable().getAUse() = this.getAReturnedExpr() + ) + or + returnExpr = this.getAReturnedExpr() + ) and + sanitizedParameter.flowsToExpr(e) and + barrierGuardBlocksExpr(guard, guardOutcome, e, state) ) and - sanitizedParameter.flowsToExpr(e) and - barrierGuardBlocksExpr(guard, guardOutcome, e, state) - ) and - sanitizedParameter.getParameter() = this.getParameter(paramIndex) + sanitizedParameter.getParameter() = this.getParameter(paramIndex) + ) } /** diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll index 29128bb72fa6..7f80a43437bd 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/DataFlowPrivate.qll @@ -408,12 +408,6 @@ class DataFlowCallable extends TDataFlowCallable { /** Gets the corresponding `LibraryCallable` if this is a library callable. */ LibraryCallable asLibraryCallable() { this = MkLibraryCallable(result) } - - int totalorder() { - result = TotalOrdering::astNodeId(this.asSourceCallable()).bitShiftLeft(1) - or - result = TotalOrdering::libraryCallableId(this.asLibraryCallable()).bitShiftLeft(1) + 1 - } } /** A callable defined in library code, identified by a unique string. */ @@ -680,7 +674,7 @@ predicate neverSkipInPathGraph(Node node) { // Include the return-value expression node.asExpr() = any(Function f).getAReturnedExpr() or - // Include calls (which may have been modelled as steps) + // Include calls (which may have been modeled as steps) node.asExpr() instanceof InvokeExpr or // Include references to a variable @@ -797,47 +791,6 @@ private newtype TDataFlowCall = FlowSummaryImpl::Private::summaryCallbackRange(c, receiver) } -private module TotalOrdering { - private predicate astNodeRefl(AstNode x, AstNode y) { x = y } - - int astNodeId(AstNode n) = equivalenceRelation(astNodeRefl/2)(n, result) - - predicate dataFlowNodeId(DataFlow::Node node, int cls, int content) { - exists(AstNode n | - node = TValueNode(n) and cls = 1 and content = astNodeId(n) - or - node = TReflectiveCallNode(n, _) and cls = 2 and content = astNodeId(n) - ) - } - - predicate callId(DataFlowCall call, int cls, int child, int extra) { - exists(DataFlow::Node node | - call = MkOrdinaryCall(node) and dataFlowNodeId(node, cls - 1000, child) and extra = 0 - or - call = MkPartialCall(node, _) and dataFlowNodeId(node, cls - 2000, child) and extra = 0 - or - call = MkBoundCall(node, extra) and dataFlowNodeId(node, cls - 3000, child) - or - call = MkAccessorCall(node) and dataFlowNodeId(node, cls - 4000, child) and extra = 0 - ) - or - exists(Function f | - call = MkImpliedLambdaCall(f) and cls = 5000 and child = astNodeId(f) and extra = 0 - ) - or - exists( - FlowSummaryImpl::Public::SummarizedCallable c, FlowSummaryImpl::Private::SummaryNode receiver - | - call = MkSummaryCall(c, receiver) and - cls = 6000 and - c = rank[child](FlowSummaryImpl::Public::SummarizedCallable cs) and - extra = 0 - ) - } - - int libraryCallableId(LibraryCallable callable) { callable = rank[result](LibraryCallable c) } -} - class DataFlowCall extends TDataFlowCall { DataFlowCallable getEnclosingCallable() { none() } // Overridden in subclass @@ -861,15 +814,6 @@ class DataFlowCall extends TDataFlowCall { } Location getLocation() { none() } // Overridden in subclass - - int totalorder() { - this = - rank[result](DataFlowCall call, int x, int y, int z | - TotalOrdering::callId(call, x, y, z) - | - call order by x, y, z - ) - } } private class OrdinaryCall extends DataFlowCall, MkOrdinaryCall { @@ -1159,7 +1103,7 @@ private predicate legacyBarrier(DataFlow::Node node) { pragma[nomagic] private predicate isBlockedLegacyNode(Node node) { // Ignore captured variable nodes for those variables that are handled by the captured-variable library. - // Note that some variables, such as top-level variables, are still modelled with these nodes (which will result in jump steps). + // Note that some variables, such as top-level variables, are still modeled with these nodes (which will result in jump steps). exists(LocalVariable variable | node = TCapturedVariableNode(variable) and variable = any(VariableCaptureConfig::CapturedVariable v).asLocalVariable() @@ -1653,8 +1597,6 @@ abstract class NodeRegion extends Unit { /** Holds if this region contains `n`. */ predicate contains(Node n) { none() } - - int totalOrder() { none() } } /** diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll index 31f5f16bbfb1..6315b34b0a4f 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/FlowSummaryPrivate.qll @@ -94,6 +94,8 @@ private string encodeContentAux(ContentSet cs, string arg) { cs = ContentSet::iteratorElement() and result = "IteratorElement" or cs = ContentSet::iteratorError() and result = "IteratorError" + or + cs = ContentSet::anyProperty() and result = "AnyMember" ) or cs = getPromiseContent(arg) and diff --git a/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll b/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll index 9e49b41052ee..8edacdc2f0f9 100644 --- a/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll +++ b/javascript/ql/lib/semmle/javascript/dataflow/internal/VariableCapture.qll @@ -170,7 +170,7 @@ module VariableCaptureConfig implements InputSig item` in `async.each(data, (item, cb) => {})`. - */ - private class IterationInputTaintStep extends TaintTracking::SharedTaintStep { - override predicate step(DataFlow::Node pred, DataFlow::Node succ) { - exists(DataFlow::FunctionNode iteratee, IterationCall call | - iteratee = call.getIteratorCallback() and // Require a closure to avoid spurious call/return mismatch. - pred = call.getCollection() and // TODO: needs a flow summary to ensure ArrayElement content is unfolded - succ = iteratee.getParameter(0) - ) + private class IterationCallFlowSummary extends DataFlow::SummarizedCallable { + private int callbackArgIndex; + + IterationCallFlowSummary() { + this = "async.IteratorCall(callbackArgIndex=" + callbackArgIndex + ")" and + callbackArgIndex in [1 .. 3] + } + + override DataFlow::InvokeNode getACallSimple() { + result instanceof IterationCall and + result.(IterationCall).getIteratorCallbackIndex() = callbackArgIndex + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + preservesValue = true and + input = "Argument[0]." + ["ArrayElement", "SetElement", "IteratorElement", "AnyMember"] and + output = "Argument[" + callbackArgIndex + "].Parameter[0]" } } @@ -152,14 +196,14 @@ module AsyncPackage { * A taint step from the return value of an iterator callback to the result of the iteration * call. * - * For example: `item + taint()` -> result` in `async.map(data, (item, cb) => cb(null, item + taint()), (err, result) => {})`. + * For example: `item + taint() -> result` in `async.map(data, (item, cb) => cb(null, item + taint()), (err, result) => {})`. */ private class IterationOutputTaintStep extends TaintTracking::SharedTaintStep { override predicate step(DataFlow::Node pred, DataFlow::Node succ) { exists( DataFlow::FunctionNode iteratee, DataFlow::FunctionNode final, int i, IterationCall call | - iteratee = call.getIteratorCallback().getALocalSource() and + iteratee = call.getIteratorCallback() and final = call.getFinalCallback() and // Require a closure to avoid spurious call/return mismatch. pred = getLastParameter(iteratee).getACall().getArgument(i) and succ = final.getParameter(i) and @@ -175,14 +219,18 @@ module AsyncPackage { * * For example: `data -> result` in `async.sortBy(data, orderingFn, (err, result) => {})`. */ - private class IterationPreserveTaintStep extends TaintTracking::SharedTaintStep { - override predicate step(DataFlow::Node pred, DataFlow::Node succ) { - exists(DataFlow::FunctionNode final, IterationCall call | - final = call.getFinalCallback() and // Require a closure to avoid spurious call/return mismatch. - pred = call.getCollection() and - succ = final.getParameter(1) and - call.getName() = "sortBy" - ) + private class IterationPreserveTaintStepFlowSummary extends DataFlow::SummarizedCallable { + IterationPreserveTaintStepFlowSummary() { this = "async.sortBy" } + + override DataFlow::InvokeNode getACallSimple() { + result instanceof IterationCall and + result.(IterationCall).getName() = "sortBy" + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + preservesValue = false and + input = "Argument[0]." + ["ArrayElement", "SetElement", "IteratorElement", "AnyMember"] and + output = "Argument[2].Parameter[1]" } } } diff --git a/javascript/ql/lib/semmle/javascript/frameworks/Babel.qll b/javascript/ql/lib/semmle/javascript/frameworks/Babel.qll index 4b3f70b77725..9ca47fb47276 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/Babel.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/Babel.qll @@ -141,16 +141,17 @@ module Babel { */ deprecated private class BabelRootTransformedPathExpr extends PathExpr, Expr { RootImportConfig plugin; - string prefix; string mappedPrefix; string suffix; BabelRootTransformedPathExpr() { this instanceof PathExpr and plugin.appliesTo(this.getTopLevel()) and - prefix = this.getStringValue().regexpCapture("(.)/(.*)", 1) and suffix = this.getStringValue().regexpCapture("(.)/(.*)", 2) and - mappedPrefix = plugin.getRoot(prefix) + exists(string prefix | + prefix = this.getStringValue().regexpCapture("(.)/(.*)", 1) and + mappedPrefix = plugin.getRoot(prefix) + ) } /** Gets the configuration that applies to this path. */ diff --git a/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll b/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll index 7c2e6aa37a58..202586227375 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/LodashUnderscore.qll @@ -341,6 +341,18 @@ module LodashUnderscore { preservesValue = true } } + + private class LodashGroupBy extends DataFlow::SummarizedCallable { + LodashGroupBy() { this = "_.groupBy" } + + override DataFlow::CallNode getACall() { result = member("groupBy").getACall() } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + input = "Argument[0]" and + output = ["Argument[1].Parameter[0]", "ReturnValue"] and + preservesValue = false + } + } } /** diff --git a/javascript/ql/lib/semmle/javascript/frameworks/React.qll b/javascript/ql/lib/semmle/javascript/frameworks/React.qll index 3a361e705940..d55ace8636df 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/React.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/React.qll @@ -311,14 +311,15 @@ class FunctionalComponent extends ReactComponent, Function { /** * A React/Preact component implemented as a class. */ -abstract private class SharedReactPreactClassComponent extends ReactComponent, ClassDefinition { +abstract private class SharedReactPreactClassComponent extends ReactComponent instanceof ClassDefinition +{ override Function getInstanceMethod(string name) { result = ClassDefinition.super.getInstanceMethod(name) } override Function getStaticMethod(string name) { exists(MethodDeclaration decl | - decl = this.getMethod(name) and + decl = ClassDefinition.super.getMethod(name) and decl.isStatic() and result = decl.getBody() ) @@ -327,7 +328,8 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C override DataFlow::SourceNode getADirectPropsAccess() { result = this.getAnInstanceReference().getAPropertyRead("props") or - result = DataFlow::parameterNode(this.getConstructor().getBody().getParameter(0)) + result = + DataFlow::parameterNode(ClassDefinition.super.getConstructor().getBody().getParameter(0)) } override AbstractValue getAbstractComponent() { result = AbstractInstance::of(this) } @@ -340,7 +342,7 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C override DataFlow::SourceNode getACandidateStateSource() { result = ReactComponent.super.getACandidateStateSource() or - result.flowsToExpr(this.getField("state").getInit()) + result.flowsToExpr(ClassDefinition.super.getField("state").getInit()) } override DataFlow::SourceNode getADefaultPropsSource() { @@ -349,6 +351,17 @@ abstract private class SharedReactPreactClassComponent extends ReactComponent, C DataFlow::valueNode(this).(DataFlow::SourceNode).hasPropertyWrite("defaultProps", props) ) } + + /** Gets the expression denoting the super class of the defined class, if any. */ + Expr getSuperClass() { result = ClassDefinition.super.getSuperClass() } + + /** + * Gets the constructor of this class. + * + * Note that every class has a constructor: if no explicit constructor + * is declared, it has a synthetic default constructor. + */ + ConstructorDeclaration getConstructor() { result = ClassDefinition.super.getConstructor() } } /** @@ -362,7 +375,7 @@ abstract class ES2015Component extends SharedReactPreactClassComponent { } */ private class DefiniteES2015Component extends ES2015Component { DefiniteES2015Component() { - exists(DataFlow::SourceNode sup | sup.flowsToExpr(this.getSuperClass()) | + exists(DataFlow::SourceNode sup | sup.flowsToExpr(this.(ClassDefinition).getSuperClass()) | exists(PropAccess access, string globalReactName | (globalReactName = "react" or globalReactName = "React") and access = sup.asExpr() @@ -400,7 +413,7 @@ abstract class PreactComponent extends SharedReactPreactClassComponent { */ private class DefinitePreactComponent extends PreactComponent { DefinitePreactComponent() { - exists(DataFlow::SourceNode sup | sup.flowsToExpr(this.getSuperClass()) | + exists(DataFlow::SourceNode sup | sup.flowsToExpr(this.(ClassDefinition).getSuperClass()) | exists(PropAccess access, string globalPreactName | (globalPreactName = "preact" or globalPreactName = "Preact") and access = sup.asExpr() @@ -419,12 +432,11 @@ private class DefinitePreactComponent extends PreactComponent { * - extends class called `Component` * - has a `render` method that returns JSX or React elements. */ -private class HeuristicReactPreactComponent extends ClassDefinition, PreactComponent, - ES2015Component -{ +private class HeuristicReactPreactComponent extends PreactComponent, ES2015Component { HeuristicReactPreactComponent() { - any(DataFlow::GlobalVarRefNode c | c.getName() = "Component").flowsToExpr(this.getSuperClass()) and - alwaysReturnsJsxOrReactElements(ClassDefinition.super.getInstanceMethod("render")) + any(DataFlow::GlobalVarRefNode c | c.getName() = "Component") + .flowsToExpr(this.(ClassDefinition).getSuperClass()) and + alwaysReturnsJsxOrReactElements(this.(ClassDefinition).getInstanceMethod("render")) } } diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll index b86d7de457ee..4969da43be34 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsExtensions.qll @@ -4,7 +4,7 @@ /** * Holds if the value at `(type, path)` should be seen as a flow - * source of the given `kind`. + * source of the given `kind` and `madId` is the data extension row number. * * The kind `remote` represents a general remote flow source. */ @@ -14,13 +14,14 @@ extensible predicate sourceModel( /** * Holds if the value at `(type, path)` should be seen as a sink - * of the given `kind`. + * of the given `kind` and `madId` is the data extension row number. */ extensible predicate sinkModel(string type, string path, string kind, QlBuiltins::ExtensionId madId); /** * Holds if in calls to `(type, path)`, the value referred to by `input` - * can flow to the value referred to by `output`. + * can flow to the value referred to by `output` and `madId` is the data + * extension row number. * * `kind` should be either `value` or `taint`, for value-preserving or taint-preserving steps, * respectively. diff --git a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll index c61ecc138ef6..f0d751ad31b6 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/data/internal/ApiGraphModelsSpecific.qll @@ -35,7 +35,7 @@ class Location = JS::Location; * Type names have form `package.type` or just `package` if referring to the package export * object. If `package` contains a `.` character it must be enclosed in single quotes, such as `'package'.type`. * - * A type name of form `(package)` may also be used when refering to the package export object. + * A type name of form `(package)` may also be used when referring to the package export object. * We allow this syntax as an alternative to the above, so models generated based on `EndpointNaming` look more consistent. * However, access paths are deliberately not parsed here, as we can not handle aliasing at this stage. * The model generator must explicitly generate the step between `(package)` and `(package).foo`, for example. diff --git a/javascript/ql/lib/semmle/javascript/frameworks/xUnit.qll b/javascript/ql/lib/semmle/javascript/frameworks/xUnit.qll index 92458cd87afe..be64f243e46f 100644 --- a/javascript/ql/lib/semmle/javascript/frameworks/xUnit.qll +++ b/javascript/ql/lib/semmle/javascript/frameworks/xUnit.qll @@ -23,6 +23,8 @@ private predicate possiblyAttribute(Expr e, string name) { ) } +final private class FinalExpr = Expr; + /** * A bracketed list of expressions. * @@ -34,15 +36,22 @@ private predicate possiblyAttribute(Expr e, string name) { * * We also allow singleton lists, as in `[a][b]`. */ -abstract private class BracketedListOfExpressions extends Expr { +abstract private class BracketedListOfExpressions extends FinalExpr { /** Gets the `i`th element expression of this list. */ abstract Expr getElement(int i); + + /** Gets the first token in this bracketed list of expressions */ + Token getFirstToken() { result = Expr.super.getFirstToken() } + + /** Gets the last token in this bracketed list of expressions */ + Token getLastToken() { result = Expr.super.getLastToken() } } /** * An array expression viewed as a bracketed list of expressions. */ -private class ArrayExprIsABracketedListOfExpressions extends ArrayExpr, BracketedListOfExpressions { +private class ArrayExprIsABracketedListOfExpressions extends BracketedListOfExpressions instanceof ArrayExpr +{ /** Gets the `i`th element of this array literal. */ override Expr getElement(int i) { result = ArrayExpr.super.getElement(i) } } diff --git a/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll b/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll index 6742429b15e4..d8e4a18dfc17 100644 --- a/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll +++ b/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll @@ -372,16 +372,28 @@ module Public { module Cfg implements BB::CfgSig { private import javascript as Js - private import codeql.util.Unit + private import codeql.controlflow.SuccessorType class ControlFlowNode = Js::ControlFlowNode; - class SuccessorType = Unit; + private predicate conditionSucc(BasicBlock bb1, BasicBlock bb2, boolean branch) { + exists(ConditionGuardNode g | + bb1 = g.getTest().getBasicBlock() and + bb2 = g.getBasicBlock() and + branch = g.getOutcome() + ) + } class BasicBlock extends FinalBasicBlock { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor() and exists(t) } + BasicBlock getASuccessor(SuccessorType t) { + conditionSucc(this, result, t.(BooleanSuccessor).getValue()) + or + result = super.getASuccessor() and + t instanceof DirectSuccessor and + not conditionSucc(this, result, _) + } predicate strictlyDominates(BasicBlock bb) { this.(ReachableBasicBlock).strictlyDominates(bb) diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll index 00fed9c4f093..6754d3db3071 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Arrays.qll @@ -1,7 +1,7 @@ /** * Contains a summary for relevant methods on arrays. * - * Note that some of Array methods are modelled in `AmbiguousCoreMethods.qll`, and `toString` is special-cased elsewhere. + * Note that some of Array methods are modeled in `AmbiguousCoreMethods.qll`, and `toString` is special-cased elsewhere. */ private import javascript @@ -60,7 +60,7 @@ private predicate isForLoopVariable(Variable v) { private predicate isLikelyArrayIndex(Expr e) { // Require that 'e' is of type number and refers to a for-loop variable. - // TODO: This is here to mirror the old behaviour. Experiment with turning the 'and' into an 'or'. + // TODO: This is here to mirror the old behavior. Experiment with turning the 'and' into an 'or'. TTNumber() = unique(InferredType type | type = e.flow().analyze().getAType()) and isForLoopVariable(e.(VarAccess).getVariable()) or @@ -114,7 +114,7 @@ class ArrayConstructorSummary extends SummarizedCallable { /** * A call to `join` with a separator argument. * - * Calls without separators are modelled in `StringConcatenation.qll`. + * Calls without separators are modeled in `StringConcatenation.qll`. */ class Join extends SummarizedCallable { Join() { this = "Array#join" } @@ -544,6 +544,25 @@ class ToSpliced extends SummarizedCallable { } } +class With extends SummarizedCallable { + With() { this = "Array#with" } + + override InstanceCall getACallSimple() { result.getMethodName() = "with" } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + // Copy all elements from the original array to the new array + input = "Argument[this].WithArrayElement" and + output = "ReturnValue" + or + // Replace the value at the specified index + input = "Argument[1]" and + output = "ReturnValue.ArrayElement" + ) + } +} + class ArrayCoercionPackage extends FunctionalPackageSummary { ArrayCoercionPackage() { this = "ArrayCoercionPackage" } diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll index a39b0e6f43d7..246ac0f19d08 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/AsyncAwait.qll @@ -8,7 +8,7 @@ private import semmle.javascript.dataflow.internal.AdditionalFlowInternal private import semmle.javascript.dataflow.internal.DataFlowPrivate /** - * Steps modelling flow in an `async` function. + * Steps modeling flow in an `async` function. * * Note about promise-coercion and flattening: * - `await` preserves non-promise values, e.g. `await "foo"` is just `"foo"`. diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/FlowSummaryUtil.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/FlowSummaryUtil.qll index a5df1d4716af..33f891935f42 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/FlowSummaryUtil.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/FlowSummaryUtil.qll @@ -49,3 +49,10 @@ string getAnArrayContent() { // Values stored at an unknown index result = "ArrayElement[?]" } + +/** + * Gets an argument position up to a certain limit. + * + * This can be used to generate flow summaries that should preserve such positions. + */ +int getAnArgumentPosition() { result = [0 .. 10] } diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll index e187b5751cfd..75815d00341d 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Generators.qll @@ -7,7 +7,7 @@ private import semmle.javascript.dataflow.internal.DataFlowNode private import semmle.javascript.dataflow.internal.AdditionalFlowInternal /** - * Steps modelling flow out of a generator function: + * Steps modeling flow out of a generator function: * ```js * function* foo() { * yield x; // store 'x' in the return value's IteratorElement diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll index e9937363c01d..6b1a182a49bd 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Iterators.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through iterators. + * Contains flow summaries and steps modeling flow through iterators. */ private import javascript diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll index 61cc1d148c6b..d9649d407c61 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Maps.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through `Map` objects. + * Contains flow summaries and steps modeling flow through `Map` objects. */ private import javascript diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll index 1122c38320a5..74048f0e397e 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Promises.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through `Promise` objects. + * Contains flow summaries and steps modeling flow through `Promise` objects. */ private import javascript @@ -368,3 +368,29 @@ private class PromiseWithResolversLike extends SummarizedCallable { ) } } + +class PromiseTry extends DataFlow::SummarizedCallable { + PromiseTry() { this = "Promise.try()" } + + override DataFlow::CallNode getACallSimple() { + result = promiseConstructorRef().getAMemberCall(["try", "attempt"]) + or + result = DataFlow::moduleImport(["p-try", "es6-promise-try"]).getACall() + } + + override predicate propagatesFlow(string input, string output, boolean preservesValue) { + preservesValue = true and + ( + exists(int i | i = getAnArgumentPosition() | + input = "Argument[" + (i + 1) + "]" and + output = "Argument[0].Parameter[" + i + "]" + ) + or + input = "Argument[0].ReturnValue" and + output = "ReturnValue.Awaited" + or + input = "Argument[0].ReturnValue[exception]" and + output = "ReturnValue.Awaited[error]" + ) + } +} diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll index 34f7d222df8b..6b4f089b38ec 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Sets.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through `Set` objects. + * Contains flow summaries and steps modeling flow through `Set` objects. */ private import javascript diff --git a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll index d18e21819653..bf9442219a75 100644 --- a/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll +++ b/javascript/ql/lib/semmle/javascript/internal/flow_summaries/Strings.qll @@ -1,5 +1,5 @@ /** - * Contains flow summaries and steps modelling flow through string methods. + * Contains flow summaries and steps modeling flow through string methods. */ private import javascript @@ -73,7 +73,7 @@ class StringSplit extends SummarizedCallable { * These are of special significance when tracking a tainted URL suffix, such as `window.location.href`, * because the first element of the resulting array should not be considered tainted. * - * This summary defaults to the same behaviour as the general `.split()` case, but it contains optional steps + * This summary defaults to the same behavior as the general `.split()` case, but it contains optional steps * and barriers named `tainted-url-suffix` that should be activated when tracking a tainted URL suffix. */ class StringSplitHashOrQuestionMark extends SummarizedCallable { diff --git a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll new file mode 100644 index 000000000000..aed0e26a6b3f --- /dev/null +++ b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationCustomizations.qll @@ -0,0 +1,85 @@ +/** + * Provides default sources, sinks and sanitizers for reasoning about + * overly permissive CORS configurations, as well as + * extension points for adding your own. + */ + +import javascript + +/** Module containing sources, sinks, and sanitizers for overly permissive CORS configurations. */ +module CorsPermissiveConfiguration { + private newtype TFlowState = + TTaint() or + TPermissive() + + /** A flow state to associate with a tracked value. */ + class FlowState extends TFlowState { + /** Gets a string representation of this flow state. */ + string toString() { + this = TTaint() and result = "taint" + or + this = TPermissive() and result = "permissive" + } + } + + /** Predicates for working with flow states. */ + module FlowState { + /** A tainted value. */ + FlowState taint() { result = TTaint() } + + /** A permissive value (true, null, or "*"). */ + FlowState permissive() { result = TPermissive() } + } + + /** + * A data flow source for permissive CORS configuration. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for permissive CORS configuration. + */ + abstract class Sink extends DataFlow::Node { } + + /** + * A sanitizer for permissive CORS configuration. + */ + abstract class Sanitizer extends DataFlow::Node { } + + /** + * An active threat-model source, considered as a flow source. + */ + private class ActiveThreatModelSourceAsSource extends Source instanceof ActiveThreatModelSource { + ActiveThreatModelSourceAsSource() { not this instanceof ClientSideRemoteFlowSource } + } + + /** An overly permissive value for `origin` configuration. */ + class PermissiveValue extends Source { + PermissiveValue() { + this.mayHaveBooleanValue(true) or + this.asExpr() instanceof NullLiteral or + this.mayHaveStringValue("*") + } + } + + /** + * The value of cors origin when initializing the application. + */ + class CorsOriginSink extends Sink, DataFlow::ValueNode { + CorsOriginSink() { this = ModelOutput::getASinkNode("cors-origin").asSink() } + } + + /** + * A sanitizer for CORS configurations where credentials are explicitly disabled. + * When credentials are false, using "*" for origin is a legitimate pattern. + */ + private class CredentialsDisabledSanitizer extends Sanitizer { + CredentialsDisabledSanitizer() { + exists(DataFlow::SourceNode config, DataFlow::CallNode call | + call.getArgument(0).getALocalSource() = config and + this = config.getAPropertyWrite("origin").getRhs() and + config.getAPropertyWrite("credentials").getRhs().mayHaveBooleanValue(false) + ) + } + } +} diff --git a/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll new file mode 100644 index 000000000000..03d20578b0e1 --- /dev/null +++ b/javascript/ql/lib/semmle/javascript/security/CorsPermissiveConfigurationQuery.qll @@ -0,0 +1,38 @@ +/** + * Provides a dataflow taint tracking configuration for reasoning + * about overly permissive CORS configurations. + * + * Note, for performance reasons: only import this file if + * `CorsPermissiveConfiguration::Configuration` is needed, + * otherwise `CorsPermissiveConfigurationCustomizations` should + * be imported instead. + */ + +import javascript +import CorsPermissiveConfigurationCustomizations::CorsPermissiveConfiguration +private import CorsPermissiveConfigurationCustomizations::CorsPermissiveConfiguration as CorsPermissiveConfiguration + +/** + * A data flow configuration for overly permissive CORS configuration. + */ +module CorsPermissiveConfigurationConfig implements DataFlow::StateConfigSig { + class FlowState = CorsPermissiveConfiguration::FlowState; + + predicate isSource(DataFlow::Node source, FlowState state) { + source instanceof PermissiveValue and state = FlowState::permissive() + or + source instanceof RemoteFlowSource and state = FlowState::taint() + } + + predicate isSink(DataFlow::Node sink, FlowState state) { + sink instanceof CorsOriginSink and + state = [FlowState::taint(), FlowState::permissive()] + } + + predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } + + predicate observeDiffInformedIncrementalMode() { any() } +} + +module CorsPermissiveConfigurationFlow = + TaintTracking::GlobalWithState; diff --git a/javascript/ql/lib/semmle/javascript/security/TaintedUrlSuffixCustomizations.qll b/javascript/ql/lib/semmle/javascript/security/TaintedUrlSuffixCustomizations.qll index 69406220462d..af6f3b36e9e7 100644 --- a/javascript/ql/lib/semmle/javascript/security/TaintedUrlSuffixCustomizations.qll +++ b/javascript/ql/lib/semmle/javascript/security/TaintedUrlSuffixCustomizations.qll @@ -76,7 +76,7 @@ module TaintedUrlSuffix { // // x [tainted-url-suffix] --> x.split('#') [array element 1] [taint] // - // Technically we should also preverse tainted-url-suffix when entering the first array element of such + // Technically we should also preserve tainted-url-suffix when entering the first array element of such // a split, but this mostly leads to FPs since we currently don't track if the taint has been through URI-decoding. // (The query/fragment parts are often URI-decoded in practice, but not the other URL parts are not) state1.isTaintedUrlSuffix() and diff --git a/javascript/ql/lib/semmle/javascript/security/dataflow/RemotePropertyInjectionQuery.qll b/javascript/ql/lib/semmle/javascript/security/dataflow/RemotePropertyInjectionQuery.qll index 8f1f174d8ecf..f338651b63de 100644 --- a/javascript/ql/lib/semmle/javascript/security/dataflow/RemotePropertyInjectionQuery.qll +++ b/javascript/ql/lib/semmle/javascript/security/dataflow/RemotePropertyInjectionQuery.qll @@ -10,6 +10,7 @@ import javascript import RemotePropertyInjectionCustomizations::RemotePropertyInjection +private import semmle.javascript.DynamicPropertyAccess /** * A taint-tracking configuration for reasoning about remote property injection. @@ -24,6 +25,10 @@ module RemotePropertyInjectionConfig implements DataFlow::ConfigSig { node = StringConcatenation::getRoot(any(ConstantString str).flow()) } + predicate isAdditionalFlowStep(DataFlow::Node node1, DataFlow::Node node2) { + node1 = node2.(EnumeratedPropName).getSourceObject() + } + predicate observeDiffInformedIncrementalMode() { any() } } diff --git a/javascript/ql/lib/semmlecode.javascript.dbscheme b/javascript/ql/lib/semmlecode.javascript.dbscheme index 76a926a00d5f..80b2bc241893 100644 --- a/javascript/ql/lib/semmlecode.javascript.dbscheme +++ b/javascript/ql/lib/semmlecode.javascript.dbscheme @@ -516,6 +516,7 @@ has_private_keyword (int id: @property ref); has_protected_keyword (int id: @property ref); has_readonly_keyword (int id: @property ref); has_type_keyword (int id: @type_keyword_operand ref); +has_defer_keyword (int id: @import_declaration ref); is_optional_member (int id: @property ref); has_definite_assignment_assertion (int id: @field_or_vardeclarator ref); is_optional_parameter_declaration (unique int parameter: @pattern ref); diff --git a/javascript/ql/lib/semmlecode.javascript.dbscheme.stats b/javascript/ql/lib/semmlecode.javascript.dbscheme.stats index eee67ae3e4ff..dd86c7346ef5 100644 --- a/javascript/ql/lib/semmlecode.javascript.dbscheme.stats +++ b/javascript/ql/lib/semmlecode.javascript.dbscheme.stats @@ -4319,6 +4319,17 @@ +has_defer_keyword +1000 + + +id +1000 + + + + + is_optional_member 3668 diff --git a/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/old.dbscheme b/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/old.dbscheme new file mode 100644 index 000000000000..76a926a00d5f --- /dev/null +++ b/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/old.dbscheme @@ -0,0 +1,1204 @@ +/*** Standard fragments ***/ + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +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 +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- JavaScript-specific part -*/ + +@location = @location_default + +@sourceline = @locatable; + +filetype( + int file: @file ref, + string filetype: string ref +) + +// top-level code fragments +toplevels (unique int id: @toplevel, + int kind: int ref); + +is_externs (int toplevel: @toplevel ref); + +case @toplevel.kind of + 0 = @script +| 1 = @inline_script +| 2 = @event_handler +| 3 = @javascript_url +| 4 = @template_toplevel; + +is_module (int tl: @toplevel ref); +is_nodejs (int tl: @toplevel ref); +is_es2015_module (int tl: @toplevel ref); +is_closure_module (int tl: @toplevel ref); + +@xml_node_with_code = @xmlelement | @xmlattribute | @template_placeholder_tag; +toplevel_parent_xml_node( + unique int toplevel: @toplevel ref, + int xmlnode: @xml_node_with_code ref); + +xml_element_parent_expression( + unique int xmlnode: @xmlelement ref, + int expression: @expr ref, + int index: int ref); + +// statements +#keyset[parent, idx] +stmts (unique int id: @stmt, + int kind: int ref, + int parent: @stmt_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +stmt_containers (unique int stmt: @stmt ref, + int container: @stmt_container ref); + +jump_targets (unique int jump: @stmt ref, + int target: @stmt ref); + +@stmt_parent = @stmt | @toplevel | @function_expr | @arrow_function_expr | @static_initializer; +@stmt_container = @toplevel | @function | @namespace_declaration | @external_module_declaration | @global_augmentation_declaration; + +case @stmt.kind of + 0 = @empty_stmt +| 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @labeled_stmt +| 5 = @break_stmt +| 6 = @continue_stmt +| 7 = @with_stmt +| 8 = @switch_stmt +| 9 = @return_stmt +| 10 = @throw_stmt +| 11 = @try_stmt +| 12 = @while_stmt +| 13 = @do_while_stmt +| 14 = @for_stmt +| 15 = @for_in_stmt +| 16 = @debugger_stmt +| 17 = @function_decl_stmt +| 18 = @var_decl_stmt +| 19 = @case +| 20 = @catch_clause +| 21 = @for_of_stmt +| 22 = @const_decl_stmt +| 23 = @let_stmt +| 24 = @legacy_let_stmt +| 25 = @for_each_stmt +| 26 = @class_decl_stmt +| 27 = @import_declaration +| 28 = @export_all_declaration +| 29 = @export_default_declaration +| 30 = @export_named_declaration +| 31 = @namespace_declaration +| 32 = @import_equals_declaration +| 33 = @export_assign_declaration +| 34 = @interface_declaration +| 35 = @type_alias_declaration +| 36 = @enum_declaration +| 37 = @external_module_declaration +| 38 = @export_as_namespace_declaration +| 39 = @global_augmentation_declaration +| 40 = @using_decl_stmt +; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @let_stmt | @legacy_let_stmt | @using_decl_stmt; + +@export_declaration = @export_all_declaration | @export_default_declaration | @export_named_declaration; + +@namespace_definition = @namespace_declaration | @enum_declaration; +@type_definition = @class_definition | @interface_declaration | @enum_declaration | @type_alias_declaration | @enum_member; + +is_instantiated(unique int decl: @namespace_declaration ref); + +@declarable_node = @decl_stmt | @namespace_declaration | @class_decl_stmt | @function_decl_stmt | @enum_declaration | @external_module_declaration | @global_augmentation_declaration | @field; +has_declare_keyword(unique int stmt: @declarable_node ref); + +is_for_await_of(unique int forof: @for_of_stmt ref); + +// expressions +#keyset[parent, idx] +exprs (unique int id: @expr, + int kind: int ref, + int parent: @expr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +literals (varchar(900) value: string ref, + varchar(900) raw: string ref, + unique int expr: @expr_or_type ref); + +enclosing_stmt (unique int expr: @expr_or_type ref, + int stmt: @stmt ref); + +expr_containers (unique int expr: @expr_or_type ref, + int container: @stmt_container ref); + +array_size (unique int ae: @arraylike ref, + int sz: int ref); + +is_delegating (int yield: @yield_expr ref); + +@expr_or_stmt = @expr | @stmt; +@expr_or_type = @expr | @typeexpr; +@expr_parent = @expr_or_stmt | @property | @function_typeexpr; +@arraylike = @array_expr | @array_pattern; +@type_annotation = @typeexpr | @jsdoc_type_expr; +@node_in_stmt_container = @cfg_node | @type_annotation | @toplevel; + +case @expr.kind of + 0 = @label +| 1 = @null_literal +| 2 = @boolean_literal +| 3 = @number_literal +| 4 = @string_literal +| 5 = @regexp_literal +| 6 = @this_expr +| 7 = @array_expr +| 8 = @obj_expr +| 9 = @function_expr +| 10 = @seq_expr +| 11 = @conditional_expr +| 12 = @new_expr +| 13 = @call_expr +| 14 = @dot_expr +| 15 = @index_expr +| 16 = @neg_expr +| 17 = @plus_expr +| 18 = @log_not_expr +| 19 = @bit_not_expr +| 20 = @typeof_expr +| 21 = @void_expr +| 22 = @delete_expr +| 23 = @eq_expr +| 24 = @neq_expr +| 25 = @eqq_expr +| 26 = @neqq_expr +| 27 = @lt_expr +| 28 = @le_expr +| 29 = @gt_expr +| 30 = @ge_expr +| 31 = @lshift_expr +| 32 = @rshift_expr +| 33 = @urshift_expr +| 34 = @add_expr +| 35 = @sub_expr +| 36 = @mul_expr +| 37 = @div_expr +| 38 = @mod_expr +| 39 = @bitor_expr +| 40 = @xor_expr +| 41 = @bitand_expr +| 42 = @in_expr +| 43 = @instanceof_expr +| 44 = @logand_expr +| 45 = @logor_expr +| 47 = @assign_expr +| 48 = @assign_add_expr +| 49 = @assign_sub_expr +| 50 = @assign_mul_expr +| 51 = @assign_div_expr +| 52 = @assign_mod_expr +| 53 = @assign_lshift_expr +| 54 = @assign_rshift_expr +| 55 = @assign_urshift_expr +| 56 = @assign_or_expr +| 57 = @assign_xor_expr +| 58 = @assign_and_expr +| 59 = @preinc_expr +| 60 = @postinc_expr +| 61 = @predec_expr +| 62 = @postdec_expr +| 63 = @par_expr +| 64 = @var_declarator +| 65 = @arrow_function_expr +| 66 = @spread_element +| 67 = @array_pattern +| 68 = @object_pattern +| 69 = @yield_expr +| 70 = @tagged_template_expr +| 71 = @template_literal +| 72 = @template_element +| 73 = @array_comprehension_expr +| 74 = @generator_expr +| 75 = @for_in_comprehension_block +| 76 = @for_of_comprehension_block +| 77 = @legacy_letexpr +| 78 = @var_decl +| 79 = @proper_varaccess +| 80 = @class_expr +| 81 = @super_expr +| 82 = @newtarget_expr +| 83 = @named_import_specifier +| 84 = @import_default_specifier +| 85 = @import_namespace_specifier +| 86 = @named_export_specifier +| 87 = @exp_expr +| 88 = @assign_exp_expr +| 89 = @jsx_element +| 90 = @jsx_qualified_name +| 91 = @jsx_empty_expr +| 92 = @await_expr +| 93 = @function_sent_expr +| 94 = @decorator +| 95 = @export_default_specifier +| 96 = @export_namespace_specifier +| 97 = @bind_expr +| 98 = @external_module_reference +| 99 = @dynamic_import +| 100 = @expression_with_type_arguments +| 101 = @prefix_type_assertion +| 102 = @as_type_assertion +| 103 = @export_varaccess +| 104 = @decorator_list +| 105 = @non_null_assertion +| 106 = @bigint_literal +| 107 = @nullishcoalescing_expr +| 108 = @e4x_xml_anyname +| 109 = @e4x_xml_static_attribute_selector +| 110 = @e4x_xml_dynamic_attribute_selector +| 111 = @e4x_xml_filter_expression +| 112 = @e4x_xml_static_qualident +| 113 = @e4x_xml_dynamic_qualident +| 114 = @e4x_xml_dotdotexpr +| 115 = @import_meta_expr +| 116 = @assignlogandexpr +| 117 = @assignlogorexpr +| 118 = @assignnullishcoalescingexpr +| 119 = @template_pipe_ref +| 120 = @generated_code_expr +| 121 = @satisfies_expr +; + +@varaccess = @proper_varaccess | @export_varaccess; +@varref = @var_decl | @varaccess; + +@identifier = @label | @varref | @type_identifier; + +@literal = @null_literal | @boolean_literal | @number_literal | @string_literal | @regexp_literal | @bigint_literal; + +@propaccess = @dot_expr | @index_expr; + +@invokeexpr = @new_expr | @call_expr; + +@unaryexpr = @neg_expr | @plus_expr | @log_not_expr | @bit_not_expr | @typeof_expr | @void_expr | @delete_expr | @spread_element; + +@equality_test = @eq_expr | @neq_expr | @eqq_expr | @neqq_expr; + +@comparison = @equality_test | @lt_expr | @le_expr | @gt_expr | @ge_expr; + +@binaryexpr = @comparison | @lshift_expr | @rshift_expr | @urshift_expr | @add_expr | @sub_expr | @mul_expr | @div_expr | @mod_expr | @exp_expr | @bitor_expr | @xor_expr | @bitand_expr | @in_expr | @instanceof_expr | @logand_expr | @logor_expr | @nullishcoalescing_expr; + +@assignment = @assign_expr | @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_mod_expr | @assign_exp_expr | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr | @assign_or_expr | @assign_xor_expr | @assign_and_expr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr; + +@updateexpr = @preinc_expr | @postinc_expr | @predec_expr | @postdec_expr; + +@pattern = @varref | @array_pattern | @object_pattern; + +@comprehension_expr = @array_comprehension_expr | @generator_expr; + +@comprehension_block = @for_in_comprehension_block | @for_of_comprehension_block; + +@import_specifier = @named_import_specifier | @import_default_specifier | @import_namespace_specifier; + +@exportspecifier = @named_export_specifier | @export_default_specifier | @export_namespace_specifier; + +@type_keyword_operand = @import_declaration | @export_declaration | @import_specifier; + +@type_assertion = @as_type_assertion | @prefix_type_assertion; + +@class_definition = @class_decl_stmt | @class_expr; +@interface_definition = @interface_declaration | @interface_typeexpr; +@class_or_interface = @class_definition | @interface_definition; + +@lexical_decl = @var_decl | @type_decl; +@lexical_access = @varaccess | @local_type_access | @local_var_type_access | @local_namespace_access; +@lexical_ref = @lexical_decl | @lexical_access; + +@e4x_xml_attribute_selector = @e4x_xml_static_attribute_selector | @e4x_xml_dynamic_attribute_selector; +@e4x_xml_qualident = @e4x_xml_static_qualident | @e4x_xml_dynamic_qualident; + +expr_contains_template_tag_location( + int expr: @expr ref, + int location: @location ref +); + +@template_placeholder_tag_parent = @xmlelement | @xmlattribute | @file; + +template_placeholder_tag_info( + unique int node: @template_placeholder_tag, + int parentNode: @template_placeholder_tag_parent ref, + varchar(900) raw: string ref +); + +// scopes +scopes (unique int id: @scope, + int kind: int ref); + +case @scope.kind of + 0 = @global_scope +| 1 = @function_scope +| 2 = @catch_scope +| 3 = @module_scope +| 4 = @block_scope +| 5 = @for_scope +| 6 = @for_in_scope // for-of scopes work the same as for-in scopes +| 7 = @comprehension_block_scope +| 8 = @class_expr_scope +| 9 = @namespace_scope +| 10 = @class_decl_scope +| 11 = @interface_scope +| 12 = @type_alias_scope +| 13 = @mapped_type_scope +| 14 = @enum_scope +| 15 = @external_module_scope +| 16 = @conditional_type_scope; + +scopenodes (unique int node: @ast_node ref, + int scope: @scope ref); + +scopenesting (unique int inner: @scope ref, + int outer: @scope ref); + +// functions +@function = @function_decl_stmt | @function_expr | @arrow_function_expr; + +@parameterized = @function | @catch_clause; +@type_parameterized = @function | @class_or_interface | @type_alias_declaration | @mapped_typeexpr | @infer_typeexpr; + +is_generator (int fun: @function ref); +has_rest_parameter (int fun: @function ref); +is_async (int fun: @function ref); + +// variables and lexically scoped type names +#keyset[scope, name] +variables (unique int id: @variable, + varchar(900) name: string ref, + int scope: @scope ref); + +#keyset[scope, name] +local_type_names (unique int id: @local_type_name, + varchar(900) name: string ref, + int scope: @scope ref); + +#keyset[scope, name] +local_namespace_names (unique int id: @local_namespace_name, + varchar(900) name: string ref, + int scope: @scope ref); + +is_arguments_object (int id: @variable ref); + +@lexical_name = @variable | @local_type_name | @local_namespace_name; + +@bind_id = @varaccess | @local_var_type_access; +bind (unique int id: @bind_id ref, + int decl: @variable ref); + +decl (unique int id: @var_decl ref, + int decl: @variable ref); + +@typebind_id = @local_type_access | @export_varaccess; +typebind (unique int id: @typebind_id ref, + int decl: @local_type_name ref); + +@typedecl_id = @type_decl | @var_decl; +typedecl (unique int id: @typedecl_id ref, + int decl: @local_type_name ref); + +namespacedecl (unique int id: @var_decl ref, + int decl: @local_namespace_name ref); + +@namespacebind_id = @local_namespace_access | @export_varaccess; +namespacebind (unique int id: @namespacebind_id ref, + int decl: @local_namespace_name ref); + + +// properties in object literals, property patterns in object patterns, and method declarations in classes +#keyset[parent, index] +properties (unique int id: @property, + int parent: @property_parent ref, + int index: int ref, + int kind: int ref, + varchar(900) tostring: string ref); + +case @property.kind of + 0 = @value_property +| 1 = @property_getter +| 2 = @property_setter +| 3 = @jsx_attribute +| 4 = @function_call_signature +| 5 = @constructor_call_signature +| 6 = @index_signature +| 7 = @enum_member +| 8 = @proper_field +| 9 = @parameter_field +| 10 = @static_initializer +; + +@property_parent = @obj_expr | @object_pattern | @class_definition | @jsx_element | @interface_definition | @enum_declaration; +@property_accessor = @property_getter | @property_setter; +@call_signature = @function_call_signature | @constructor_call_signature; +@field = @proper_field | @parameter_field; +@field_or_vardeclarator = @field | @var_declarator; + +is_computed (int id: @property ref); +is_method (int id: @property ref); +is_static (int id: @property ref); +is_abstract_member (int id: @property ref); +is_const_enum (int id: @enum_declaration ref); +is_abstract_class (int id: @class_decl_stmt ref); + +has_public_keyword (int id: @property ref); +has_private_keyword (int id: @property ref); +has_protected_keyword (int id: @property ref); +has_readonly_keyword (int id: @property ref); +has_type_keyword (int id: @type_keyword_operand ref); +is_optional_member (int id: @property ref); +has_definite_assignment_assertion (int id: @field_or_vardeclarator ref); +is_optional_parameter_declaration (unique int parameter: @pattern ref); + +#keyset[constructor, param_index] +parameter_fields( + unique int field: @parameter_field ref, + int constructor: @function_expr ref, + int param_index: int ref +); + +// types +#keyset[parent, idx] +typeexprs ( + unique int id: @typeexpr, + int kind: int ref, + int parent: @typeexpr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref +); + +case @typeexpr.kind of + 0 = @local_type_access +| 1 = @type_decl +| 2 = @keyword_typeexpr +| 3 = @string_literal_typeexpr +| 4 = @number_literal_typeexpr +| 5 = @boolean_literal_typeexpr +| 6 = @array_typeexpr +| 7 = @union_typeexpr +| 8 = @indexed_access_typeexpr +| 9 = @intersection_typeexpr +| 10 = @parenthesized_typeexpr +| 11 = @tuple_typeexpr +| 12 = @keyof_typeexpr +| 13 = @qualified_type_access +| 14 = @generic_typeexpr +| 15 = @type_label +| 16 = @typeof_typeexpr +| 17 = @local_var_type_access +| 18 = @qualified_var_type_access +| 19 = @this_var_type_access +| 20 = @predicate_typeexpr +| 21 = @interface_typeexpr +| 22 = @type_parameter +| 23 = @plain_function_typeexpr +| 24 = @constructor_typeexpr +| 25 = @local_namespace_access +| 26 = @qualified_namespace_access +| 27 = @mapped_typeexpr +| 28 = @conditional_typeexpr +| 29 = @infer_typeexpr +| 30 = @import_type_access +| 31 = @import_namespace_access +| 32 = @import_var_type_access +| 33 = @optional_typeexpr +| 34 = @rest_typeexpr +| 35 = @bigint_literal_typeexpr +| 36 = @readonly_typeexpr +| 37 = @template_literal_typeexpr +; + +@typeref = @typeaccess | @type_decl; +@type_identifier = @type_decl | @local_type_access | @type_label | @local_var_type_access | @local_namespace_access; +@typeexpr_parent = @expr | @stmt | @property | @typeexpr; +@literal_typeexpr = @string_literal_typeexpr | @number_literal_typeexpr | @boolean_literal_typeexpr | @bigint_literal_typeexpr; +@typeaccess = @local_type_access | @qualified_type_access | @import_type_access; +@vartypeaccess = @local_var_type_access | @qualified_var_type_access | @this_var_type_access | @import_var_type_access; +@namespace_access = @local_namespace_access | @qualified_namespace_access | @import_namespace_access; +@import_typeexpr = @import_type_access | @import_namespace_access | @import_var_type_access; + +@function_typeexpr = @plain_function_typeexpr | @constructor_typeexpr; + +// types +types ( + unique int id: @type, + int kind: int ref, + varchar(900) tostring: string ref +); + +#keyset[parent, idx] +type_child ( + int child: @type ref, + int parent: @type ref, + int idx: int ref +); + +case @type.kind of + 0 = @any_type +| 1 = @string_type +| 2 = @number_type +| 3 = @union_type +| 4 = @true_type +| 5 = @false_type +| 6 = @type_reference +| 7 = @object_type +| 8 = @canonical_type_variable_type +| 9 = @typeof_type +| 10 = @void_type +| 11 = @undefined_type +| 12 = @null_type +| 13 = @never_type +| 14 = @plain_symbol_type +| 15 = @unique_symbol_type +| 16 = @objectkeyword_type +| 17 = @intersection_type +| 18 = @tuple_type +| 19 = @lexical_type_variable_type +| 20 = @this_type +| 21 = @number_literal_type +| 22 = @string_literal_type +| 23 = @unknown_type +| 24 = @bigint_type +| 25 = @bigint_literal_type +; + +@boolean_literal_type = @true_type | @false_type; +@symbol_type = @plain_symbol_type | @unique_symbol_type; +@union_or_intersection_type = @union_type | @intersection_type; +@typevariable_type = @canonical_type_variable_type | @lexical_type_variable_type; + +has_asserts_keyword(int node: @predicate_typeexpr ref); + +@typed_ast_node = @expr | @typeexpr | @function; +ast_node_type( + unique int node: @typed_ast_node ref, + int typ: @type ref); + +declared_function_signature( + unique int node: @function ref, + int sig: @signature_type ref +); + +invoke_expr_signature( + unique int node: @invokeexpr ref, + int sig: @signature_type ref +); + +invoke_expr_overload_index( + unique int node: @invokeexpr ref, + int index: int ref +); + +symbols ( + unique int id: @symbol, + int kind: int ref, + varchar(900) name: string ref +); + +symbol_parent ( + unique int symbol: @symbol ref, + int parent: @symbol ref +); + +symbol_module ( + int symbol: @symbol ref, + varchar(900) moduleName: string ref +); + +symbol_global ( + int symbol: @symbol ref, + varchar(900) globalName: string ref +); + +case @symbol.kind of + 0 = @root_symbol +| 1 = @member_symbol +| 2 = @other_symbol +; + +@type_with_symbol = @type_reference | @typevariable_type | @typeof_type | @unique_symbol_type; +@ast_node_with_symbol = @type_definition | @namespace_definition | @toplevel | @typeaccess | @namespace_access | @var_decl | @function | @invokeexpr | @import_declaration | @external_module_reference | @external_module_declaration; + +ast_node_symbol( + unique int node: @ast_node_with_symbol ref, + int symbol: @symbol ref); + +type_symbol( + unique int typ: @type_with_symbol ref, + int symbol: @symbol ref); + +#keyset[typ, name] +type_property( + int typ: @type ref, + varchar(900) name: string ref, + int propertyType: @type ref); + +type_alias( + unique int aliasType: @type ref, + int underlyingType: @type ref); + +@literal_type = @string_literal_type | @number_literal_type | @boolean_literal_type | @bigint_literal_type; +@type_with_literal_value = @string_literal_type | @number_literal_type | @bigint_literal_type; +type_literal_value( + unique int typ: @type_with_literal_value ref, + varchar(900) value: string ref); + +signature_types ( + unique int id: @signature_type, + int kind: int ref, + varchar(900) tostring: string ref, + int type_parameters: int ref, + int required_params: int ref +); + +is_abstract_signature( + unique int sig: @signature_type ref +); + +signature_rest_parameter( + unique int sig: @signature_type ref, + int rest_param_arra_type: @type ref +); + +case @signature_type.kind of + 0 = @function_signature_type +| 1 = @constructor_signature_type +; + +#keyset[typ, kind, index] +type_contains_signature ( + int typ: @type ref, + int kind: int ref, // constructor/call/index + int index: int ref, // ordering of overloaded signatures + int sig: @signature_type ref +); + +#keyset[parent, index] +signature_contains_type ( + int child: @type ref, + int parent: @signature_type ref, + int index: int ref +); + +#keyset[sig, index] +signature_parameter_name ( + int sig: @signature_type ref, + int index: int ref, + varchar(900) name: string ref +); + +number_index_type ( + unique int baseType: @type ref, + int propertyType: @type ref +); + +string_index_type ( + unique int baseType: @type ref, + int propertyType: @type ref +); + +base_type_names( + int typeName: @symbol ref, + int baseTypeName: @symbol ref +); + +self_types( + int typeName: @symbol ref, + int selfType: @type_reference ref +); + +tuple_type_min_length( + unique int typ: @type ref, + int minLength: int ref +); + +tuple_type_rest_index( + unique int typ: @type ref, + int index: int ref +); + +// comments +comments (unique int id: @comment, + int kind: int ref, + int toplevel: @toplevel ref, + varchar(900) text: string ref, + varchar(900) tostring: string ref); + +case @comment.kind of + 0 = @slashslash_comment +| 1 = @slashstar_comment +| 2 = @doc_comment +| 3 = @html_comment_start +| 4 = @htmlcommentend; + +@html_comment = @html_comment_start | @htmlcommentend; +@line_comment = @slashslash_comment | @html_comment; +@block_comment = @slashstar_comment | @doc_comment; + +// source lines +lines (unique int id: @line, + int toplevel: @toplevel ref, + varchar(900) text: string ref, + varchar(2) terminator: string ref); +indentation (int file: @file ref, + int lineno: int ref, + varchar(1) indentChar: string ref, + int indentDepth: int ref); + +// JavaScript parse errors +js_parse_errors (unique int id: @js_parse_error, + int toplevel: @toplevel ref, + varchar(900) message: string ref, + varchar(900) line: string ref); + +// regular expressions +#keyset[parent, idx] +regexpterm (unique int id: @regexpterm, + int kind: int ref, + int parent: @regexpparent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +@regexpparent = @regexpterm | @regexp_literal | @string_literal | @add_expr; + +case @regexpterm.kind of + 0 = @regexp_alt +| 1 = @regexp_seq +| 2 = @regexp_caret +| 3 = @regexp_dollar +| 4 = @regexp_wordboundary +| 5 = @regexp_nonwordboundary +| 6 = @regexp_positive_lookahead +| 7 = @regexp_negative_lookahead +| 8 = @regexp_star +| 9 = @regexp_plus +| 10 = @regexp_opt +| 11 = @regexp_range +| 12 = @regexp_dot +| 13 = @regexp_group +| 14 = @regexp_normal_constant +| 15 = @regexp_hex_escape +| 16 = @regexp_unicode_escape +| 17 = @regexp_dec_escape +| 18 = @regexp_oct_escape +| 19 = @regexp_ctrl_escape +| 20 = @regexp_char_class_escape +| 21 = @regexp_id_escape +| 22 = @regexp_backref +| 23 = @regexp_char_class +| 24 = @regexp_char_range +| 25 = @regexp_positive_lookbehind +| 26 = @regexp_negative_lookbehind +| 27 = @regexp_unicode_property_escape +| 28 = @regexp_quoted_string +| 29 = @regexp_intersection +| 30 = @regexp_subtraction; + +regexp_parse_errors (unique int id: @regexp_parse_error, + int regexp: @regexpterm ref, + varchar(900) message: string ref); + +@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range; +@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape; +@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape; +@regexp_constant = @regexp_normal_constant | @regexp_char_escape; +@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead; +@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind; +@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind; +@regexp_anchor = @regexp_dollar | @regexp_caret; + +is_greedy (int id: @regexp_quantifier ref); +range_quantifier_lower_bound (unique int id: @regexp_range ref, int lo: int ref); +range_quantifier_upper_bound (unique int id: @regexp_range ref, int hi: int ref); +is_capture (unique int id: @regexp_group ref, int number: int ref); +is_named_capture (unique int id: @regexp_group ref, string name: string ref); +is_inverted (int id: @regexp_char_class ref); +regexp_const_value (unique int id: @regexp_constant ref, varchar(1) value: string ref); +char_class_escape (unique int id: @regexp_char_class_escape ref, varchar(1) value: string ref); +backref (unique int id: @regexp_backref ref, int value: int ref); +named_backref (unique int id: @regexp_backref ref, string name: string ref); +unicode_property_escapename (unique int id: @regexp_unicode_property_escape ref, string name: string ref); +unicode_property_escapevalue (unique int id: @regexp_unicode_property_escape ref, string value: string ref); + +// tokens +#keyset[toplevel, idx] +tokeninfo (unique int id: @token, + int kind: int ref, + int toplevel: @toplevel ref, + int idx: int ref, + varchar(900) value: string ref); + +case @token.kind of + 0 = @token_eof +| 1 = @token_null_literal +| 2 = @token_boolean_literal +| 3 = @token_numeric_literal +| 4 = @token_string_literal +| 5 = @token_regular_expression +| 6 = @token_identifier +| 7 = @token_keyword +| 8 = @token_punctuator; + +// associate comments with the token immediately following them (which may be EOF) +next_token (int comment: @comment ref, int token: @token ref); + +// JSON +#keyset[parent, idx] +json (unique int id: @json_value, + int kind: int ref, + int parent: @json_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +json_literals (varchar(900) value: string ref, + varchar(900) raw: string ref, + unique int expr: @json_value ref); + +json_properties (int obj: @json_object ref, + varchar(900) property: string ref, + int value: @json_value ref); + +json_errors (unique int id: @json_parse_error, + varchar(900) message: string ref); + +json_locations(unique int locatable: @json_locatable ref, + int location: @location_default ref); + +case @json_value.kind of + 0 = @json_null +| 1 = @json_boolean +| 2 = @json_number +| 3 = @json_string +| 4 = @json_array +| 5 = @json_object; + +@json_parent = @json_object | @json_array | @file; + +@json_locatable = @json_value | @json_parse_error; + +// locations +@ast_node = @toplevel | @stmt | @expr | @property | @typeexpr; + +@locatable = @file + | @ast_node + | @comment + | @line + | @js_parse_error | @regexp_parse_error + | @regexpterm + | @json_locatable + | @token + | @cfg_node + | @jsdoc | @jsdoc_type_expr | @jsdoc_tag + | @yaml_locatable + | @xmllocatable + | @configLocatable + | @template_placeholder_tag; + +hasLocation (unique int locatable: @locatable ref, + int location: @location ref); + +// CFG +entry_cfg_node (unique int id: @entry_node, int container: @stmt_container ref); +exit_cfg_node (unique int id: @exit_node, int container: @stmt_container ref); +guard_node (unique int id: @guard_node, int kind: int ref, int test: @expr ref); +case @guard_node.kind of + 0 = @falsy_guard +| 1 = @truthy_guard; +@condition_guard = @falsy_guard | @truthy_guard; + +@synthetic_cfg_node = @entry_node | @exit_node | @guard_node; +@cfg_node = @synthetic_cfg_node | @expr_parent; + +successor (int pred: @cfg_node ref, int succ: @cfg_node ref); + +// JSDoc comments +jsdoc (unique int id: @jsdoc, varchar(900) description: string ref, int comment: @comment ref); +#keyset[parent, idx] +jsdoc_tags (unique int id: @jsdoc_tag, varchar(900) title: string ref, + int parent: @jsdoc ref, int idx: int ref, varchar(900) tostring: string ref); +jsdoc_tag_descriptions (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref); +jsdoc_tag_names (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref); + +#keyset[parent, idx] +jsdoc_type_exprs (unique int id: @jsdoc_type_expr, + int kind: int ref, + int parent: @jsdoc_type_expr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); +case @jsdoc_type_expr.kind of + 0 = @jsdoc_any_type_expr +| 1 = @jsdoc_null_type_expr +| 2 = @jsdoc_undefined_type_expr +| 3 = @jsdoc_unknown_type_expr +| 4 = @jsdoc_void_type_expr +| 5 = @jsdoc_identifier_type_expr +| 6 = @jsdoc_applied_type_expr +| 7 = @jsdoc_nullable_type_expr +| 8 = @jsdoc_non_nullable_type_expr +| 9 = @jsdoc_record_type_expr +| 10 = @jsdoc_array_type_expr +| 11 = @jsdoc_union_type_expr +| 12 = @jsdoc_function_type_expr +| 13 = @jsdoc_optional_type_expr +| 14 = @jsdoc_rest_type_expr +| 15 = @jsdoc_qualified_type_expr +; + +#keyset[id, idx] +jsdoc_record_field_name (int id: @jsdoc_record_type_expr ref, int idx: int ref, varchar(900) name: string ref); +jsdoc_prefix_qualifier (int id: @jsdoc_type_expr ref); +jsdoc_has_new_parameter (int fn: @jsdoc_function_type_expr ref); + +@jsdoc_type_expr_parent = @jsdoc_type_expr | @jsdoc_tag; + +jsdoc_errors (unique int id: @jsdoc_error, int tag: @jsdoc_tag ref, varchar(900) message: string ref, varchar(900) tostring: string ref); + +@dataflownode = @expr | @function_decl_stmt | @class_decl_stmt | @namespace_declaration | @enum_declaration | @property; + +@optionalchainable = @call_expr | @propaccess; + +isOptionalChaining(int id: @optionalchainable ref); + +/** + * The time taken for the extraction of a file. + * This table contains non-deterministic content. + * + * The sum of the `time` column for each (`file`, `timerKind`) pair + * is the total time taken for extraction of `file`. The `extractionPhase` + * column provides a granular view of the extraction time of the file. + */ +extraction_time( + int file : @file ref, + // see `com.semmle.js.extractor.ExtractionMetrics.ExtractionPhase`. + int extractionPhase: int ref, + // 0 for the elapsed CPU time in nanoseconds, 1 for the elapsed wallclock time in nanoseconds + int timerKind: int ref, + float time: float ref +) + +/** +* Non-timing related data for the extraction of a single file. +* This table contains non-deterministic content. +*/ +extraction_data( + int file : @file ref, + // the absolute path to the cache file + varchar(900) cacheFile: string ref, + boolean fromCache: boolean ref, + int length: int ref +) + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- 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; + +/*- Configuration files with key value pairs -*/ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); diff --git a/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/semmlecode.javascript.dbscheme b/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/semmlecode.javascript.dbscheme new file mode 100644 index 000000000000..80b2bc241893 --- /dev/null +++ b/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/semmlecode.javascript.dbscheme @@ -0,0 +1,1205 @@ +/*** Standard fragments ***/ + +/*- Files and folders -*/ + +/** + * The location of an element. + * The location spans column `startcolumn` of line `startline` to + * column `endcolumn` of line `endline` in file `file`. + * For more information, see + * [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ +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 +); + +files( + unique int id: @file, + string name: string ref +); + +folders( + unique int id: @folder, + string name: string ref +); + +@container = @file | @folder + +containerparent( + int parent: @container ref, + unique int child: @container ref +); + +/*- Lines of code -*/ + +numlines( + int element_id: @sourceline ref, + int num_lines: int ref, + int num_code: int ref, + int num_comment: int ref +); + +/*- External data -*/ + +/** + * External data, loaded from CSV files during snapshot creation. See + * [Tutorial: Incorporating external data](https://help.semmle.com/wiki/display/SD/Tutorial%3A+Incorporating+external+data) + * for more information. + */ +externalData( + int id : @externalDataElement, + string path : string ref, + int column: int ref, + string value : string ref +); + +/*- Source location prefix -*/ + +/** + * The source location of the snapshot. + */ +sourceLocationPrefix(string prefix : string ref); + +/*- JavaScript-specific part -*/ + +@location = @location_default + +@sourceline = @locatable; + +filetype( + int file: @file ref, + string filetype: string ref +) + +// top-level code fragments +toplevels (unique int id: @toplevel, + int kind: int ref); + +is_externs (int toplevel: @toplevel ref); + +case @toplevel.kind of + 0 = @script +| 1 = @inline_script +| 2 = @event_handler +| 3 = @javascript_url +| 4 = @template_toplevel; + +is_module (int tl: @toplevel ref); +is_nodejs (int tl: @toplevel ref); +is_es2015_module (int tl: @toplevel ref); +is_closure_module (int tl: @toplevel ref); + +@xml_node_with_code = @xmlelement | @xmlattribute | @template_placeholder_tag; +toplevel_parent_xml_node( + unique int toplevel: @toplevel ref, + int xmlnode: @xml_node_with_code ref); + +xml_element_parent_expression( + unique int xmlnode: @xmlelement ref, + int expression: @expr ref, + int index: int ref); + +// statements +#keyset[parent, idx] +stmts (unique int id: @stmt, + int kind: int ref, + int parent: @stmt_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +stmt_containers (unique int stmt: @stmt ref, + int container: @stmt_container ref); + +jump_targets (unique int jump: @stmt ref, + int target: @stmt ref); + +@stmt_parent = @stmt | @toplevel | @function_expr | @arrow_function_expr | @static_initializer; +@stmt_container = @toplevel | @function | @namespace_declaration | @external_module_declaration | @global_augmentation_declaration; + +case @stmt.kind of + 0 = @empty_stmt +| 1 = @block_stmt +| 2 = @expr_stmt +| 3 = @if_stmt +| 4 = @labeled_stmt +| 5 = @break_stmt +| 6 = @continue_stmt +| 7 = @with_stmt +| 8 = @switch_stmt +| 9 = @return_stmt +| 10 = @throw_stmt +| 11 = @try_stmt +| 12 = @while_stmt +| 13 = @do_while_stmt +| 14 = @for_stmt +| 15 = @for_in_stmt +| 16 = @debugger_stmt +| 17 = @function_decl_stmt +| 18 = @var_decl_stmt +| 19 = @case +| 20 = @catch_clause +| 21 = @for_of_stmt +| 22 = @const_decl_stmt +| 23 = @let_stmt +| 24 = @legacy_let_stmt +| 25 = @for_each_stmt +| 26 = @class_decl_stmt +| 27 = @import_declaration +| 28 = @export_all_declaration +| 29 = @export_default_declaration +| 30 = @export_named_declaration +| 31 = @namespace_declaration +| 32 = @import_equals_declaration +| 33 = @export_assign_declaration +| 34 = @interface_declaration +| 35 = @type_alias_declaration +| 36 = @enum_declaration +| 37 = @external_module_declaration +| 38 = @export_as_namespace_declaration +| 39 = @global_augmentation_declaration +| 40 = @using_decl_stmt +; + +@decl_stmt = @var_decl_stmt | @const_decl_stmt | @let_stmt | @legacy_let_stmt | @using_decl_stmt; + +@export_declaration = @export_all_declaration | @export_default_declaration | @export_named_declaration; + +@namespace_definition = @namespace_declaration | @enum_declaration; +@type_definition = @class_definition | @interface_declaration | @enum_declaration | @type_alias_declaration | @enum_member; + +is_instantiated(unique int decl: @namespace_declaration ref); + +@declarable_node = @decl_stmt | @namespace_declaration | @class_decl_stmt | @function_decl_stmt | @enum_declaration | @external_module_declaration | @global_augmentation_declaration | @field; +has_declare_keyword(unique int stmt: @declarable_node ref); + +is_for_await_of(unique int forof: @for_of_stmt ref); + +// expressions +#keyset[parent, idx] +exprs (unique int id: @expr, + int kind: int ref, + int parent: @expr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +literals (varchar(900) value: string ref, + varchar(900) raw: string ref, + unique int expr: @expr_or_type ref); + +enclosing_stmt (unique int expr: @expr_or_type ref, + int stmt: @stmt ref); + +expr_containers (unique int expr: @expr_or_type ref, + int container: @stmt_container ref); + +array_size (unique int ae: @arraylike ref, + int sz: int ref); + +is_delegating (int yield: @yield_expr ref); + +@expr_or_stmt = @expr | @stmt; +@expr_or_type = @expr | @typeexpr; +@expr_parent = @expr_or_stmt | @property | @function_typeexpr; +@arraylike = @array_expr | @array_pattern; +@type_annotation = @typeexpr | @jsdoc_type_expr; +@node_in_stmt_container = @cfg_node | @type_annotation | @toplevel; + +case @expr.kind of + 0 = @label +| 1 = @null_literal +| 2 = @boolean_literal +| 3 = @number_literal +| 4 = @string_literal +| 5 = @regexp_literal +| 6 = @this_expr +| 7 = @array_expr +| 8 = @obj_expr +| 9 = @function_expr +| 10 = @seq_expr +| 11 = @conditional_expr +| 12 = @new_expr +| 13 = @call_expr +| 14 = @dot_expr +| 15 = @index_expr +| 16 = @neg_expr +| 17 = @plus_expr +| 18 = @log_not_expr +| 19 = @bit_not_expr +| 20 = @typeof_expr +| 21 = @void_expr +| 22 = @delete_expr +| 23 = @eq_expr +| 24 = @neq_expr +| 25 = @eqq_expr +| 26 = @neqq_expr +| 27 = @lt_expr +| 28 = @le_expr +| 29 = @gt_expr +| 30 = @ge_expr +| 31 = @lshift_expr +| 32 = @rshift_expr +| 33 = @urshift_expr +| 34 = @add_expr +| 35 = @sub_expr +| 36 = @mul_expr +| 37 = @div_expr +| 38 = @mod_expr +| 39 = @bitor_expr +| 40 = @xor_expr +| 41 = @bitand_expr +| 42 = @in_expr +| 43 = @instanceof_expr +| 44 = @logand_expr +| 45 = @logor_expr +| 47 = @assign_expr +| 48 = @assign_add_expr +| 49 = @assign_sub_expr +| 50 = @assign_mul_expr +| 51 = @assign_div_expr +| 52 = @assign_mod_expr +| 53 = @assign_lshift_expr +| 54 = @assign_rshift_expr +| 55 = @assign_urshift_expr +| 56 = @assign_or_expr +| 57 = @assign_xor_expr +| 58 = @assign_and_expr +| 59 = @preinc_expr +| 60 = @postinc_expr +| 61 = @predec_expr +| 62 = @postdec_expr +| 63 = @par_expr +| 64 = @var_declarator +| 65 = @arrow_function_expr +| 66 = @spread_element +| 67 = @array_pattern +| 68 = @object_pattern +| 69 = @yield_expr +| 70 = @tagged_template_expr +| 71 = @template_literal +| 72 = @template_element +| 73 = @array_comprehension_expr +| 74 = @generator_expr +| 75 = @for_in_comprehension_block +| 76 = @for_of_comprehension_block +| 77 = @legacy_letexpr +| 78 = @var_decl +| 79 = @proper_varaccess +| 80 = @class_expr +| 81 = @super_expr +| 82 = @newtarget_expr +| 83 = @named_import_specifier +| 84 = @import_default_specifier +| 85 = @import_namespace_specifier +| 86 = @named_export_specifier +| 87 = @exp_expr +| 88 = @assign_exp_expr +| 89 = @jsx_element +| 90 = @jsx_qualified_name +| 91 = @jsx_empty_expr +| 92 = @await_expr +| 93 = @function_sent_expr +| 94 = @decorator +| 95 = @export_default_specifier +| 96 = @export_namespace_specifier +| 97 = @bind_expr +| 98 = @external_module_reference +| 99 = @dynamic_import +| 100 = @expression_with_type_arguments +| 101 = @prefix_type_assertion +| 102 = @as_type_assertion +| 103 = @export_varaccess +| 104 = @decorator_list +| 105 = @non_null_assertion +| 106 = @bigint_literal +| 107 = @nullishcoalescing_expr +| 108 = @e4x_xml_anyname +| 109 = @e4x_xml_static_attribute_selector +| 110 = @e4x_xml_dynamic_attribute_selector +| 111 = @e4x_xml_filter_expression +| 112 = @e4x_xml_static_qualident +| 113 = @e4x_xml_dynamic_qualident +| 114 = @e4x_xml_dotdotexpr +| 115 = @import_meta_expr +| 116 = @assignlogandexpr +| 117 = @assignlogorexpr +| 118 = @assignnullishcoalescingexpr +| 119 = @template_pipe_ref +| 120 = @generated_code_expr +| 121 = @satisfies_expr +; + +@varaccess = @proper_varaccess | @export_varaccess; +@varref = @var_decl | @varaccess; + +@identifier = @label | @varref | @type_identifier; + +@literal = @null_literal | @boolean_literal | @number_literal | @string_literal | @regexp_literal | @bigint_literal; + +@propaccess = @dot_expr | @index_expr; + +@invokeexpr = @new_expr | @call_expr; + +@unaryexpr = @neg_expr | @plus_expr | @log_not_expr | @bit_not_expr | @typeof_expr | @void_expr | @delete_expr | @spread_element; + +@equality_test = @eq_expr | @neq_expr | @eqq_expr | @neqq_expr; + +@comparison = @equality_test | @lt_expr | @le_expr | @gt_expr | @ge_expr; + +@binaryexpr = @comparison | @lshift_expr | @rshift_expr | @urshift_expr | @add_expr | @sub_expr | @mul_expr | @div_expr | @mod_expr | @exp_expr | @bitor_expr | @xor_expr | @bitand_expr | @in_expr | @instanceof_expr | @logand_expr | @logor_expr | @nullishcoalescing_expr; + +@assignment = @assign_expr | @assign_add_expr | @assign_sub_expr | @assign_mul_expr | @assign_div_expr | @assign_mod_expr | @assign_exp_expr | @assign_lshift_expr | @assign_rshift_expr | @assign_urshift_expr | @assign_or_expr | @assign_xor_expr | @assign_and_expr | @assignlogandexpr | @assignlogorexpr | @assignnullishcoalescingexpr; + +@updateexpr = @preinc_expr | @postinc_expr | @predec_expr | @postdec_expr; + +@pattern = @varref | @array_pattern | @object_pattern; + +@comprehension_expr = @array_comprehension_expr | @generator_expr; + +@comprehension_block = @for_in_comprehension_block | @for_of_comprehension_block; + +@import_specifier = @named_import_specifier | @import_default_specifier | @import_namespace_specifier; + +@exportspecifier = @named_export_specifier | @export_default_specifier | @export_namespace_specifier; + +@type_keyword_operand = @import_declaration | @export_declaration | @import_specifier; + +@type_assertion = @as_type_assertion | @prefix_type_assertion; + +@class_definition = @class_decl_stmt | @class_expr; +@interface_definition = @interface_declaration | @interface_typeexpr; +@class_or_interface = @class_definition | @interface_definition; + +@lexical_decl = @var_decl | @type_decl; +@lexical_access = @varaccess | @local_type_access | @local_var_type_access | @local_namespace_access; +@lexical_ref = @lexical_decl | @lexical_access; + +@e4x_xml_attribute_selector = @e4x_xml_static_attribute_selector | @e4x_xml_dynamic_attribute_selector; +@e4x_xml_qualident = @e4x_xml_static_qualident | @e4x_xml_dynamic_qualident; + +expr_contains_template_tag_location( + int expr: @expr ref, + int location: @location ref +); + +@template_placeholder_tag_parent = @xmlelement | @xmlattribute | @file; + +template_placeholder_tag_info( + unique int node: @template_placeholder_tag, + int parentNode: @template_placeholder_tag_parent ref, + varchar(900) raw: string ref +); + +// scopes +scopes (unique int id: @scope, + int kind: int ref); + +case @scope.kind of + 0 = @global_scope +| 1 = @function_scope +| 2 = @catch_scope +| 3 = @module_scope +| 4 = @block_scope +| 5 = @for_scope +| 6 = @for_in_scope // for-of scopes work the same as for-in scopes +| 7 = @comprehension_block_scope +| 8 = @class_expr_scope +| 9 = @namespace_scope +| 10 = @class_decl_scope +| 11 = @interface_scope +| 12 = @type_alias_scope +| 13 = @mapped_type_scope +| 14 = @enum_scope +| 15 = @external_module_scope +| 16 = @conditional_type_scope; + +scopenodes (unique int node: @ast_node ref, + int scope: @scope ref); + +scopenesting (unique int inner: @scope ref, + int outer: @scope ref); + +// functions +@function = @function_decl_stmt | @function_expr | @arrow_function_expr; + +@parameterized = @function | @catch_clause; +@type_parameterized = @function | @class_or_interface | @type_alias_declaration | @mapped_typeexpr | @infer_typeexpr; + +is_generator (int fun: @function ref); +has_rest_parameter (int fun: @function ref); +is_async (int fun: @function ref); + +// variables and lexically scoped type names +#keyset[scope, name] +variables (unique int id: @variable, + varchar(900) name: string ref, + int scope: @scope ref); + +#keyset[scope, name] +local_type_names (unique int id: @local_type_name, + varchar(900) name: string ref, + int scope: @scope ref); + +#keyset[scope, name] +local_namespace_names (unique int id: @local_namespace_name, + varchar(900) name: string ref, + int scope: @scope ref); + +is_arguments_object (int id: @variable ref); + +@lexical_name = @variable | @local_type_name | @local_namespace_name; + +@bind_id = @varaccess | @local_var_type_access; +bind (unique int id: @bind_id ref, + int decl: @variable ref); + +decl (unique int id: @var_decl ref, + int decl: @variable ref); + +@typebind_id = @local_type_access | @export_varaccess; +typebind (unique int id: @typebind_id ref, + int decl: @local_type_name ref); + +@typedecl_id = @type_decl | @var_decl; +typedecl (unique int id: @typedecl_id ref, + int decl: @local_type_name ref); + +namespacedecl (unique int id: @var_decl ref, + int decl: @local_namespace_name ref); + +@namespacebind_id = @local_namespace_access | @export_varaccess; +namespacebind (unique int id: @namespacebind_id ref, + int decl: @local_namespace_name ref); + + +// properties in object literals, property patterns in object patterns, and method declarations in classes +#keyset[parent, index] +properties (unique int id: @property, + int parent: @property_parent ref, + int index: int ref, + int kind: int ref, + varchar(900) tostring: string ref); + +case @property.kind of + 0 = @value_property +| 1 = @property_getter +| 2 = @property_setter +| 3 = @jsx_attribute +| 4 = @function_call_signature +| 5 = @constructor_call_signature +| 6 = @index_signature +| 7 = @enum_member +| 8 = @proper_field +| 9 = @parameter_field +| 10 = @static_initializer +; + +@property_parent = @obj_expr | @object_pattern | @class_definition | @jsx_element | @interface_definition | @enum_declaration; +@property_accessor = @property_getter | @property_setter; +@call_signature = @function_call_signature | @constructor_call_signature; +@field = @proper_field | @parameter_field; +@field_or_vardeclarator = @field | @var_declarator; + +is_computed (int id: @property ref); +is_method (int id: @property ref); +is_static (int id: @property ref); +is_abstract_member (int id: @property ref); +is_const_enum (int id: @enum_declaration ref); +is_abstract_class (int id: @class_decl_stmt ref); + +has_public_keyword (int id: @property ref); +has_private_keyword (int id: @property ref); +has_protected_keyword (int id: @property ref); +has_readonly_keyword (int id: @property ref); +has_type_keyword (int id: @type_keyword_operand ref); +has_defer_keyword (int id: @import_declaration ref); +is_optional_member (int id: @property ref); +has_definite_assignment_assertion (int id: @field_or_vardeclarator ref); +is_optional_parameter_declaration (unique int parameter: @pattern ref); + +#keyset[constructor, param_index] +parameter_fields( + unique int field: @parameter_field ref, + int constructor: @function_expr ref, + int param_index: int ref +); + +// types +#keyset[parent, idx] +typeexprs ( + unique int id: @typeexpr, + int kind: int ref, + int parent: @typeexpr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref +); + +case @typeexpr.kind of + 0 = @local_type_access +| 1 = @type_decl +| 2 = @keyword_typeexpr +| 3 = @string_literal_typeexpr +| 4 = @number_literal_typeexpr +| 5 = @boolean_literal_typeexpr +| 6 = @array_typeexpr +| 7 = @union_typeexpr +| 8 = @indexed_access_typeexpr +| 9 = @intersection_typeexpr +| 10 = @parenthesized_typeexpr +| 11 = @tuple_typeexpr +| 12 = @keyof_typeexpr +| 13 = @qualified_type_access +| 14 = @generic_typeexpr +| 15 = @type_label +| 16 = @typeof_typeexpr +| 17 = @local_var_type_access +| 18 = @qualified_var_type_access +| 19 = @this_var_type_access +| 20 = @predicate_typeexpr +| 21 = @interface_typeexpr +| 22 = @type_parameter +| 23 = @plain_function_typeexpr +| 24 = @constructor_typeexpr +| 25 = @local_namespace_access +| 26 = @qualified_namespace_access +| 27 = @mapped_typeexpr +| 28 = @conditional_typeexpr +| 29 = @infer_typeexpr +| 30 = @import_type_access +| 31 = @import_namespace_access +| 32 = @import_var_type_access +| 33 = @optional_typeexpr +| 34 = @rest_typeexpr +| 35 = @bigint_literal_typeexpr +| 36 = @readonly_typeexpr +| 37 = @template_literal_typeexpr +; + +@typeref = @typeaccess | @type_decl; +@type_identifier = @type_decl | @local_type_access | @type_label | @local_var_type_access | @local_namespace_access; +@typeexpr_parent = @expr | @stmt | @property | @typeexpr; +@literal_typeexpr = @string_literal_typeexpr | @number_literal_typeexpr | @boolean_literal_typeexpr | @bigint_literal_typeexpr; +@typeaccess = @local_type_access | @qualified_type_access | @import_type_access; +@vartypeaccess = @local_var_type_access | @qualified_var_type_access | @this_var_type_access | @import_var_type_access; +@namespace_access = @local_namespace_access | @qualified_namespace_access | @import_namespace_access; +@import_typeexpr = @import_type_access | @import_namespace_access | @import_var_type_access; + +@function_typeexpr = @plain_function_typeexpr | @constructor_typeexpr; + +// types +types ( + unique int id: @type, + int kind: int ref, + varchar(900) tostring: string ref +); + +#keyset[parent, idx] +type_child ( + int child: @type ref, + int parent: @type ref, + int idx: int ref +); + +case @type.kind of + 0 = @any_type +| 1 = @string_type +| 2 = @number_type +| 3 = @union_type +| 4 = @true_type +| 5 = @false_type +| 6 = @type_reference +| 7 = @object_type +| 8 = @canonical_type_variable_type +| 9 = @typeof_type +| 10 = @void_type +| 11 = @undefined_type +| 12 = @null_type +| 13 = @never_type +| 14 = @plain_symbol_type +| 15 = @unique_symbol_type +| 16 = @objectkeyword_type +| 17 = @intersection_type +| 18 = @tuple_type +| 19 = @lexical_type_variable_type +| 20 = @this_type +| 21 = @number_literal_type +| 22 = @string_literal_type +| 23 = @unknown_type +| 24 = @bigint_type +| 25 = @bigint_literal_type +; + +@boolean_literal_type = @true_type | @false_type; +@symbol_type = @plain_symbol_type | @unique_symbol_type; +@union_or_intersection_type = @union_type | @intersection_type; +@typevariable_type = @canonical_type_variable_type | @lexical_type_variable_type; + +has_asserts_keyword(int node: @predicate_typeexpr ref); + +@typed_ast_node = @expr | @typeexpr | @function; +ast_node_type( + unique int node: @typed_ast_node ref, + int typ: @type ref); + +declared_function_signature( + unique int node: @function ref, + int sig: @signature_type ref +); + +invoke_expr_signature( + unique int node: @invokeexpr ref, + int sig: @signature_type ref +); + +invoke_expr_overload_index( + unique int node: @invokeexpr ref, + int index: int ref +); + +symbols ( + unique int id: @symbol, + int kind: int ref, + varchar(900) name: string ref +); + +symbol_parent ( + unique int symbol: @symbol ref, + int parent: @symbol ref +); + +symbol_module ( + int symbol: @symbol ref, + varchar(900) moduleName: string ref +); + +symbol_global ( + int symbol: @symbol ref, + varchar(900) globalName: string ref +); + +case @symbol.kind of + 0 = @root_symbol +| 1 = @member_symbol +| 2 = @other_symbol +; + +@type_with_symbol = @type_reference | @typevariable_type | @typeof_type | @unique_symbol_type; +@ast_node_with_symbol = @type_definition | @namespace_definition | @toplevel | @typeaccess | @namespace_access | @var_decl | @function | @invokeexpr | @import_declaration | @external_module_reference | @external_module_declaration; + +ast_node_symbol( + unique int node: @ast_node_with_symbol ref, + int symbol: @symbol ref); + +type_symbol( + unique int typ: @type_with_symbol ref, + int symbol: @symbol ref); + +#keyset[typ, name] +type_property( + int typ: @type ref, + varchar(900) name: string ref, + int propertyType: @type ref); + +type_alias( + unique int aliasType: @type ref, + int underlyingType: @type ref); + +@literal_type = @string_literal_type | @number_literal_type | @boolean_literal_type | @bigint_literal_type; +@type_with_literal_value = @string_literal_type | @number_literal_type | @bigint_literal_type; +type_literal_value( + unique int typ: @type_with_literal_value ref, + varchar(900) value: string ref); + +signature_types ( + unique int id: @signature_type, + int kind: int ref, + varchar(900) tostring: string ref, + int type_parameters: int ref, + int required_params: int ref +); + +is_abstract_signature( + unique int sig: @signature_type ref +); + +signature_rest_parameter( + unique int sig: @signature_type ref, + int rest_param_arra_type: @type ref +); + +case @signature_type.kind of + 0 = @function_signature_type +| 1 = @constructor_signature_type +; + +#keyset[typ, kind, index] +type_contains_signature ( + int typ: @type ref, + int kind: int ref, // constructor/call/index + int index: int ref, // ordering of overloaded signatures + int sig: @signature_type ref +); + +#keyset[parent, index] +signature_contains_type ( + int child: @type ref, + int parent: @signature_type ref, + int index: int ref +); + +#keyset[sig, index] +signature_parameter_name ( + int sig: @signature_type ref, + int index: int ref, + varchar(900) name: string ref +); + +number_index_type ( + unique int baseType: @type ref, + int propertyType: @type ref +); + +string_index_type ( + unique int baseType: @type ref, + int propertyType: @type ref +); + +base_type_names( + int typeName: @symbol ref, + int baseTypeName: @symbol ref +); + +self_types( + int typeName: @symbol ref, + int selfType: @type_reference ref +); + +tuple_type_min_length( + unique int typ: @type ref, + int minLength: int ref +); + +tuple_type_rest_index( + unique int typ: @type ref, + int index: int ref +); + +// comments +comments (unique int id: @comment, + int kind: int ref, + int toplevel: @toplevel ref, + varchar(900) text: string ref, + varchar(900) tostring: string ref); + +case @comment.kind of + 0 = @slashslash_comment +| 1 = @slashstar_comment +| 2 = @doc_comment +| 3 = @html_comment_start +| 4 = @htmlcommentend; + +@html_comment = @html_comment_start | @htmlcommentend; +@line_comment = @slashslash_comment | @html_comment; +@block_comment = @slashstar_comment | @doc_comment; + +// source lines +lines (unique int id: @line, + int toplevel: @toplevel ref, + varchar(900) text: string ref, + varchar(2) terminator: string ref); +indentation (int file: @file ref, + int lineno: int ref, + varchar(1) indentChar: string ref, + int indentDepth: int ref); + +// JavaScript parse errors +js_parse_errors (unique int id: @js_parse_error, + int toplevel: @toplevel ref, + varchar(900) message: string ref, + varchar(900) line: string ref); + +// regular expressions +#keyset[parent, idx] +regexpterm (unique int id: @regexpterm, + int kind: int ref, + int parent: @regexpparent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +@regexpparent = @regexpterm | @regexp_literal | @string_literal | @add_expr; + +case @regexpterm.kind of + 0 = @regexp_alt +| 1 = @regexp_seq +| 2 = @regexp_caret +| 3 = @regexp_dollar +| 4 = @regexp_wordboundary +| 5 = @regexp_nonwordboundary +| 6 = @regexp_positive_lookahead +| 7 = @regexp_negative_lookahead +| 8 = @regexp_star +| 9 = @regexp_plus +| 10 = @regexp_opt +| 11 = @regexp_range +| 12 = @regexp_dot +| 13 = @regexp_group +| 14 = @regexp_normal_constant +| 15 = @regexp_hex_escape +| 16 = @regexp_unicode_escape +| 17 = @regexp_dec_escape +| 18 = @regexp_oct_escape +| 19 = @regexp_ctrl_escape +| 20 = @regexp_char_class_escape +| 21 = @regexp_id_escape +| 22 = @regexp_backref +| 23 = @regexp_char_class +| 24 = @regexp_char_range +| 25 = @regexp_positive_lookbehind +| 26 = @regexp_negative_lookbehind +| 27 = @regexp_unicode_property_escape +| 28 = @regexp_quoted_string +| 29 = @regexp_intersection +| 30 = @regexp_subtraction; + +regexp_parse_errors (unique int id: @regexp_parse_error, + int regexp: @regexpterm ref, + varchar(900) message: string ref); + +@regexp_quantifier = @regexp_star | @regexp_plus | @regexp_opt | @regexp_range; +@regexp_escape = @regexp_char_escape | @regexp_char_class_escape | @regexp_unicode_property_escape; +@regexp_char_escape = @regexp_hex_escape | @regexp_unicode_escape | @regexp_dec_escape | @regexp_oct_escape | @regexp_ctrl_escape | @regexp_id_escape; +@regexp_constant = @regexp_normal_constant | @regexp_char_escape; +@regexp_lookahead = @regexp_positive_lookahead | @regexp_negative_lookahead; +@regexp_lookbehind = @regexp_positive_lookbehind | @regexp_negative_lookbehind; +@regexp_subpattern = @regexp_lookahead | @regexp_lookbehind; +@regexp_anchor = @regexp_dollar | @regexp_caret; + +is_greedy (int id: @regexp_quantifier ref); +range_quantifier_lower_bound (unique int id: @regexp_range ref, int lo: int ref); +range_quantifier_upper_bound (unique int id: @regexp_range ref, int hi: int ref); +is_capture (unique int id: @regexp_group ref, int number: int ref); +is_named_capture (unique int id: @regexp_group ref, string name: string ref); +is_inverted (int id: @regexp_char_class ref); +regexp_const_value (unique int id: @regexp_constant ref, varchar(1) value: string ref); +char_class_escape (unique int id: @regexp_char_class_escape ref, varchar(1) value: string ref); +backref (unique int id: @regexp_backref ref, int value: int ref); +named_backref (unique int id: @regexp_backref ref, string name: string ref); +unicode_property_escapename (unique int id: @regexp_unicode_property_escape ref, string name: string ref); +unicode_property_escapevalue (unique int id: @regexp_unicode_property_escape ref, string value: string ref); + +// tokens +#keyset[toplevel, idx] +tokeninfo (unique int id: @token, + int kind: int ref, + int toplevel: @toplevel ref, + int idx: int ref, + varchar(900) value: string ref); + +case @token.kind of + 0 = @token_eof +| 1 = @token_null_literal +| 2 = @token_boolean_literal +| 3 = @token_numeric_literal +| 4 = @token_string_literal +| 5 = @token_regular_expression +| 6 = @token_identifier +| 7 = @token_keyword +| 8 = @token_punctuator; + +// associate comments with the token immediately following them (which may be EOF) +next_token (int comment: @comment ref, int token: @token ref); + +// JSON +#keyset[parent, idx] +json (unique int id: @json_value, + int kind: int ref, + int parent: @json_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); + +json_literals (varchar(900) value: string ref, + varchar(900) raw: string ref, + unique int expr: @json_value ref); + +json_properties (int obj: @json_object ref, + varchar(900) property: string ref, + int value: @json_value ref); + +json_errors (unique int id: @json_parse_error, + varchar(900) message: string ref); + +json_locations(unique int locatable: @json_locatable ref, + int location: @location_default ref); + +case @json_value.kind of + 0 = @json_null +| 1 = @json_boolean +| 2 = @json_number +| 3 = @json_string +| 4 = @json_array +| 5 = @json_object; + +@json_parent = @json_object | @json_array | @file; + +@json_locatable = @json_value | @json_parse_error; + +// locations +@ast_node = @toplevel | @stmt | @expr | @property | @typeexpr; + +@locatable = @file + | @ast_node + | @comment + | @line + | @js_parse_error | @regexp_parse_error + | @regexpterm + | @json_locatable + | @token + | @cfg_node + | @jsdoc | @jsdoc_type_expr | @jsdoc_tag + | @yaml_locatable + | @xmllocatable + | @configLocatable + | @template_placeholder_tag; + +hasLocation (unique int locatable: @locatable ref, + int location: @location ref); + +// CFG +entry_cfg_node (unique int id: @entry_node, int container: @stmt_container ref); +exit_cfg_node (unique int id: @exit_node, int container: @stmt_container ref); +guard_node (unique int id: @guard_node, int kind: int ref, int test: @expr ref); +case @guard_node.kind of + 0 = @falsy_guard +| 1 = @truthy_guard; +@condition_guard = @falsy_guard | @truthy_guard; + +@synthetic_cfg_node = @entry_node | @exit_node | @guard_node; +@cfg_node = @synthetic_cfg_node | @expr_parent; + +successor (int pred: @cfg_node ref, int succ: @cfg_node ref); + +// JSDoc comments +jsdoc (unique int id: @jsdoc, varchar(900) description: string ref, int comment: @comment ref); +#keyset[parent, idx] +jsdoc_tags (unique int id: @jsdoc_tag, varchar(900) title: string ref, + int parent: @jsdoc ref, int idx: int ref, varchar(900) tostring: string ref); +jsdoc_tag_descriptions (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref); +jsdoc_tag_names (unique int tag: @jsdoc_tag ref, varchar(900) text: string ref); + +#keyset[parent, idx] +jsdoc_type_exprs (unique int id: @jsdoc_type_expr, + int kind: int ref, + int parent: @jsdoc_type_expr_parent ref, + int idx: int ref, + varchar(900) tostring: string ref); +case @jsdoc_type_expr.kind of + 0 = @jsdoc_any_type_expr +| 1 = @jsdoc_null_type_expr +| 2 = @jsdoc_undefined_type_expr +| 3 = @jsdoc_unknown_type_expr +| 4 = @jsdoc_void_type_expr +| 5 = @jsdoc_identifier_type_expr +| 6 = @jsdoc_applied_type_expr +| 7 = @jsdoc_nullable_type_expr +| 8 = @jsdoc_non_nullable_type_expr +| 9 = @jsdoc_record_type_expr +| 10 = @jsdoc_array_type_expr +| 11 = @jsdoc_union_type_expr +| 12 = @jsdoc_function_type_expr +| 13 = @jsdoc_optional_type_expr +| 14 = @jsdoc_rest_type_expr +| 15 = @jsdoc_qualified_type_expr +; + +#keyset[id, idx] +jsdoc_record_field_name (int id: @jsdoc_record_type_expr ref, int idx: int ref, varchar(900) name: string ref); +jsdoc_prefix_qualifier (int id: @jsdoc_type_expr ref); +jsdoc_has_new_parameter (int fn: @jsdoc_function_type_expr ref); + +@jsdoc_type_expr_parent = @jsdoc_type_expr | @jsdoc_tag; + +jsdoc_errors (unique int id: @jsdoc_error, int tag: @jsdoc_tag ref, varchar(900) message: string ref, varchar(900) tostring: string ref); + +@dataflownode = @expr | @function_decl_stmt | @class_decl_stmt | @namespace_declaration | @enum_declaration | @property; + +@optionalchainable = @call_expr | @propaccess; + +isOptionalChaining(int id: @optionalchainable ref); + +/** + * The time taken for the extraction of a file. + * This table contains non-deterministic content. + * + * The sum of the `time` column for each (`file`, `timerKind`) pair + * is the total time taken for extraction of `file`. The `extractionPhase` + * column provides a granular view of the extraction time of the file. + */ +extraction_time( + int file : @file ref, + // see `com.semmle.js.extractor.ExtractionMetrics.ExtractionPhase`. + int extractionPhase: int ref, + // 0 for the elapsed CPU time in nanoseconds, 1 for the elapsed wallclock time in nanoseconds + int timerKind: int ref, + float time: float ref +) + +/** +* Non-timing related data for the extraction of a single file. +* This table contains non-deterministic content. +*/ +extraction_data( + int file : @file ref, + // the absolute path to the cache file + varchar(900) cacheFile: string ref, + boolean fromCache: boolean ref, + int length: int ref +) + +/*- YAML -*/ + +#keyset[parent, idx] +yaml (unique int id: @yaml_node, + int kind: int ref, + int parent: @yaml_node_parent ref, + int idx: int ref, + string tag: string ref, + string tostring: string ref); + +case @yaml_node.kind of + 0 = @yaml_scalar_node +| 1 = @yaml_mapping_node +| 2 = @yaml_sequence_node +| 3 = @yaml_alias_node +; + +@yaml_collection_node = @yaml_mapping_node | @yaml_sequence_node; + +@yaml_node_parent = @yaml_collection_node | @file; + +yaml_anchors (unique int node: @yaml_node ref, + string anchor: string ref); + +yaml_aliases (unique int alias: @yaml_alias_node ref, + string target: string ref); + +yaml_scalars (unique int scalar: @yaml_scalar_node ref, + int style: int ref, + string value: string ref); + +yaml_errors (unique int id: @yaml_error, + string message: string ref); + +yaml_locations(unique int locatable: @yaml_locatable ref, + int location: @location_default ref); + +@yaml_locatable = @yaml_node | @yaml_error; + +/*- 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; + +/*- Configuration files with key value pairs -*/ + +configs( + unique int id: @config +); + +configNames( + unique int id: @configName, + int config: @config ref, + string name: string ref +); + +configValues( + unique int id: @configValue, + int config: @config ref, + string value: string ref +); + +configLocations( + int locatable: @configLocatable ref, + int location: @location_default ref +); + +@configLocatable = @config | @configName | @configValue; + +/*- Database metadata -*/ +databaseMetadata( + string metadataKey: string ref, + string value: string ref +); + +overlayChangedFiles( + string path: string ref +); diff --git a/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/upgrade.properties b/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/upgrade.properties new file mode 100644 index 000000000000..2acd37b6a3a1 --- /dev/null +++ b/javascript/ql/lib/upgrades/76a926a00d5f3bc199c203a1437796fd7b2835ba/upgrade.properties @@ -0,0 +1,2 @@ +description: add support for deferred imports +compatibility: backwards diff --git a/javascript/ql/src/CHANGELOG.md b/javascript/ql/src/CHANGELOG.md index ab471438cb11..619bc14bf299 100644 --- a/javascript/ql/src/CHANGELOG.md +++ b/javascript/ql/src/CHANGELOG.md @@ -1,3 +1,17 @@ +## 2.1.0 + +### Major Analysis Improvements + +* Added support for TypeScript 5.9 +* Added support for `import defer` syntax in JavaScript and TypeScript. + +### Minor Analysis Improvements + +* Data flow is now tracked through the `Promise.try` and `Array.prototype.with` functions. +* Query `js/index-out-of-bounds` no longer produces a false-positive when a strictly-less-than check overrides a previous less-than-or-equal test. +* The query `js/remote-property-injection` now detects property injection vulnerabilities through object enumeration patterns such as `Object.keys()`. +* The query "Permissive CORS configuration" (`js/cors-permissive-configuration`) has been promoted from experimental and is now part of the default security suite. + ## 2.0.3 No user-facing changes. diff --git a/javascript/ql/src/Declarations/UnreachableMethodOverloads.ql b/javascript/ql/src/Declarations/UnreachableMethodOverloads.ql index 912d58ab54ca..0088af1a2c0c 100644 --- a/javascript/ql/src/Declarations/UnreachableMethodOverloads.ql +++ b/javascript/ql/src/Declarations/UnreachableMethodOverloads.ql @@ -46,9 +46,7 @@ string getKind(MemberDeclaration m) { * A call-signature that originates from a MethodSignature in the AST. */ private class MethodCallSig extends Function { - private MethodSignature signature; - - MethodCallSig() { this = signature.getBody() } + MethodCallSig() { this = any(MethodSignature signature).getBody() } int getNumOptionalParameter() { result = count(Parameter p | p = this.getParameter(_) and p.isDeclaredOptional()) diff --git a/javascript/ql/src/LanguageFeatures/LengthComparisonOffByOne.ql b/javascript/ql/src/LanguageFeatures/LengthComparisonOffByOne.ql index 4f3815d6fc6b..c5766d61cd6e 100644 --- a/javascript/ql/src/LanguageFeatures/LengthComparisonOffByOne.ql +++ b/javascript/ql/src/LanguageFeatures/LengthComparisonOffByOne.ql @@ -33,6 +33,18 @@ ConditionGuardNode getLengthLEGuard(Variable index, Variable array) { ) } +/** + * Gets a condition that checks that `index` is less than `array.length`. + */ +ConditionGuardNode getLengthLTGuard(Variable index, Variable array) { + exists(RelationalComparison cmp | cmp instanceof GTExpr or cmp instanceof LTExpr | + cmp = result.getTest() and + result.getOutcome() = true and + cmp.getGreaterOperand() = arrayLen(array) and + cmp.getLesserOperand() = index.getAnAccess() + ) +} + /** * Gets a condition that checks that `index` is not equal to `array.length`. */ @@ -62,7 +74,8 @@ where elementRead(ea, array, index, bb) and // and the read is guarded by the comparison cond.dominates(bb) and - // but the read is not guarded by another check that `index != array.length` - not getLengthNEGuard(index, array).dominates(bb) + // but the read is not guarded by another check that `index != array.length` or `index < array.length` + not getLengthNEGuard(index, array).dominates(bb) and + not getLengthLTGuard(index, array).dominates(bb) select cond.getTest(), "Off-by-one index comparison against length may lead to out-of-bounds $@.", ea, "read" diff --git a/javascript/ql/src/Security/CWE-116/IncompleteMultiCharacterSanitization.qhelp b/javascript/ql/src/Security/CWE-116/IncompleteMultiCharacterSanitization.qhelp index 63f28578ec1e..b5ef7781f361 100644 --- a/javascript/ql/src/Security/CWE-116/IncompleteMultiCharacterSanitization.qhelp +++ b/javascript/ql/src/Security/CWE-116/IncompleteMultiCharacterSanitization.qhelp @@ -108,7 +108,7 @@ str.replace(/\.\.\//g, "");

-The regular expression attempts to strip out all occurences of /../ from str. +The regular expression attempts to strip out all occurrences of /../ from str. This will not work as expected: for the string /./.././, for example, it will remove the single occurrence of /../ in the middle, but the remainder of the string then becomes /../, which is another instance of the substring we were trying to remove. diff --git a/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp new file mode 100644 index 000000000000..04796dfbc189 --- /dev/null +++ b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.qhelp @@ -0,0 +1,73 @@ + + + + +

+ + A server can use CORS (Cross-Origin Resource Sharing) to relax the + restrictions imposed by the Same-Origin Policy, allowing controlled, secure + cross-origin requests when necessary. + +

+

+ + A server with an overly permissive CORS configuration may inadvertently + expose sensitive data or enable CSRF attacks, which allow attackers to trick + users into performing unwanted operations on websites they're authenticated to. + +

+ + + +

+ + When the origin is set to true, the server + accepts requests from any origin, potentially exposing the system to + CSRF attacks. Use false as the origin value or implement a whitelist + of allowed origins instead. + +

+

+ + When the origin is set to null, it can be + exploited by an attacker who can deceive a user into making + requests from a null origin, often hosted within a sandboxed iframe. + +

+

+ + If the origin value is user-controlled, ensure that the data + is properly sanitized and validated against a whitelist of allowed origins. + +

+
+ + +

+ + In the following example, server_1 accepts requests from any origin + because the value of origin is set to true. + server_2 uses user-controlled data for the origin without validation. + +

+ + + +

+ + To fix these issues, server_1 uses a restrictive CORS configuration + that is not vulnerable to CSRF attacks. server_2 properly validates + user-controlled data against a whitelist before using it. + +

+ + +
+ + +
+
  • W3C: CORS for developers, Advice for Resource Owners.
  • + + diff --git a/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql new file mode 100644 index 000000000000..1699129d2a05 --- /dev/null +++ b/javascript/ql/src/Security/CWE-942/CorsPermissiveConfiguration.ql @@ -0,0 +1,22 @@ +/** + * @name Permissive CORS configuration + * @description Cross-origin resource sharing (CORS) policy allows overly broad access. + * @kind path-problem + * @problem.severity warning + * @security-severity 6.0 + * @precision high + * @id js/cors-permissive-configuration + * @tags security + * external/cwe/cwe-942 + */ + +import javascript +import semmle.javascript.security.CorsPermissiveConfigurationQuery as CorsQuery +import CorsQuery::CorsPermissiveConfigurationFlow::PathGraph + +from + CorsQuery::CorsPermissiveConfigurationFlow::PathNode source, + CorsQuery::CorsPermissiveConfigurationFlow::PathNode sink +where CorsQuery::CorsPermissiveConfigurationFlow::flowPath(source, sink) +select sink.getNode(), source, sink, "CORS Origin allows broad access due to $@.", source.getNode(), + "permissive or user controlled value" diff --git a/javascript/ql/src/experimental/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js b/javascript/ql/src/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js similarity index 100% rename from javascript/ql/src/experimental/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js rename to javascript/ql/src/Security/CWE-942/examples/CorsPermissiveConfigurationBad.js diff --git a/javascript/ql/src/experimental/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js b/javascript/ql/src/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js similarity index 100% rename from javascript/ql/src/experimental/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js rename to javascript/ql/src/Security/CWE-942/examples/CorsPermissiveConfigurationGood.js diff --git a/javascript/ql/src/change-notes/released/2.1.0.md b/javascript/ql/src/change-notes/released/2.1.0.md new file mode 100644 index 000000000000..e0ef5ddd6e15 --- /dev/null +++ b/javascript/ql/src/change-notes/released/2.1.0.md @@ -0,0 +1,13 @@ +## 2.1.0 + +### Major Analysis Improvements + +* Added support for TypeScript 5.9 +* Added support for `import defer` syntax in JavaScript and TypeScript. + +### Minor Analysis Improvements + +* Data flow is now tracked through the `Promise.try` and `Array.prototype.with` functions. +* Query `js/index-out-of-bounds` no longer produces a false-positive when a strictly-less-than check overrides a previous less-than-or-equal test. +* The query `js/remote-property-injection` now detects property injection vulnerabilities through object enumeration patterns such as `Object.keys()`. +* The query "Permissive CORS configuration" (`js/cors-permissive-configuration`) has been promoted from experimental and is now part of the default security suite. diff --git a/javascript/ql/src/codeql-pack.release.yml b/javascript/ql/src/codeql-pack.release.yml index fabf1e865966..487a1a58b2b8 100644 --- a/javascript/ql/src/codeql-pack.release.yml +++ b/javascript/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.3 +lastReleaseVersion: 2.1.0 diff --git a/javascript/ql/src/experimental/Security/CWE-918/SSRF.js b/javascript/ql/src/experimental/Security/CWE-918/SSRF.js index e39e97604417..7e47b6dfd174 100644 --- a/javascript/ql/src/experimental/Security/CWE-918/SSRF.js +++ b/javascript/ql/src/experimental/Security/CWE-918/SSRF.js @@ -1,7 +1,7 @@ const axios = require('axios'); export const handler = async (req, res, next) => { - const { target } = req.body; + const { target } = req.body; try { // BAD: `target` is controlled by the attacker diff --git a/javascript/ql/src/experimental/Security/CWE-918/SSRFGood.js b/javascript/ql/src/experimental/Security/CWE-918/SSRFGood.js index 10ab26e607b7..e91c1131338b 100644 --- a/javascript/ql/src/experimental/Security/CWE-918/SSRFGood.js +++ b/javascript/ql/src/experimental/Security/CWE-918/SSRFGood.js @@ -2,7 +2,7 @@ const axios = require('axios'); const validator = require('validator'); export const handler = async (req, res, next) => { - const { target } = req.body; + const { target } = req.body; if (!validator.isAlphanumeric(target)) { return next(new Error('Bad request')); diff --git a/javascript/ql/src/experimental/Security/CWE-942/Apollo.qll b/javascript/ql/src/experimental/Security/CWE-942/Apollo.qll deleted file mode 100644 index 983c0a8ac89c..000000000000 --- a/javascript/ql/src/experimental/Security/CWE-942/Apollo.qll +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Provides classes for working with Apollo GraphQL connectors. - */ - -import javascript - -/** Provides classes modeling the apollo packages [@apollo/server](https://npmjs.com/package/@apollo/server`) */ -module Apollo { - /** Get a reference to the `ApolloServer` class. */ - private API::Node apollo() { - result = - API::moduleImport([ - "@apollo/server", "@apollo/apollo-server-express", "@apollo/apollo-server-core", - "apollo-server", "apollo-server-express" - ]).getMember("ApolloServer") - } - - /** Gets a reference to the `gql` function that parses GraphQL strings. */ - private API::Node gql() { - result = - API::moduleImport([ - "@apollo/server", "@apollo/apollo-server-express", "@apollo/apollo-server-core", - "apollo-server", "apollo-server-express" - ]).getMember("gql") - } - - /** An instantiation of an `ApolloServer`. */ - class ApolloServer extends API::NewNode { - ApolloServer() { this = apollo().getAnInstantiation() } - } - - /** A string that is interpreted as a GraphQL query by a `apollo` package. */ - private class ApolloGraphQLString extends GraphQL::GraphQLString { - ApolloGraphQLString() { this = gql().getACall().getArgument(0) } - } -} diff --git a/javascript/ql/src/experimental/Security/CWE-942/Cors.qll b/javascript/ql/src/experimental/Security/CWE-942/Cors.qll deleted file mode 100644 index cc190e6f4294..000000000000 --- a/javascript/ql/src/experimental/Security/CWE-942/Cors.qll +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Provides classes for working with Cors connectors. - */ - -import javascript - -/** Provides classes modeling the [cors](https://npmjs.com/package/cors) library. */ -module Cors { - /** - * An expression that creates a new CORS configuration. - */ - class Cors extends DataFlow::CallNode { - Cors() { this = DataFlow::moduleImport("cors").getAnInvocation() } - - /** Get the options used to configure Cors */ - DataFlow::Node getOptionsArgument() { result = this.getArgument(0) } - - /** Holds if cors is using default configuration */ - predicate isDefault() { this.getNumArgument() = 0 } - - /** Gets the value of the `origin` option used to configure this Cors instance. */ - DataFlow::Node getOrigin() { result = this.getOptionArgument(0, "origin") } - } -} diff --git a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.qhelp b/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.qhelp deleted file mode 100644 index fc79eee743bf..000000000000 --- a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.qhelp +++ /dev/null @@ -1,71 +0,0 @@ - - - - -

    - - A server can use CORS (Cross-Origin Resource Sharing) to relax the - restrictions imposed by the SOP (Same-Origin Policy), allowing controlled, secure - cross-origin requests when necessary. - - A server with an overly permissive CORS configuration may inadvertently - expose sensitive data or lead to CSRF which is an attack that allows attackers to trick - users into performing unwanted operations in websites they're authenticated to. - -

    - -
    - - -

    - - When the origin is set to true, it signifies that the server - is accepting requests from any origin, potentially exposing the system to - CSRF attacks. This can be fixed using false as origin value or using a whitelist. - -

    -

    - - On the other hand, if the origin is - set to null, it can be exploited by an attacker to deceive a user into making - requests from a null origin form, often hosted within a sandboxed iframe. - -

    - -

    - - If the origin value is user controlled, make sure that the data - is properly sanitized. - -

    -
    - - -

    - - In the example below, the server_1 accepts requests from any origin - since the value of origin is set to true. - And server_2's origin is user-controlled. - -

    - - - -

    - - In the example below, the server_1 CORS is restrictive so it's not - vulnerable to CSRF attacks. And server_2's is using properly sanitized - user-controlled data. - -

    - - -
    - - -
  • Mozilla Developer Network: CORS, Access-Control-Allow-Origin.
  • -
  • W3C: CORS for developers, Advice for Resource Owners
  • -
    -
    diff --git a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.ql b/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.ql deleted file mode 100644 index 87db66ad98d9..000000000000 --- a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfiguration.ql +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @name overly CORS configuration - * @description Misconfiguration of CORS HTTP headers allows CSRF attacks. - * @kind path-problem - * @problem.severity error - * @security-severity 7.5 - * @precision high - * @id js/cors-misconfiguration - * @tags security - * external/cwe/cwe-942 - */ - -import javascript -import CorsPermissiveConfigurationQuery -import CorsPermissiveConfigurationFlow::PathGraph - -from - CorsPermissiveConfigurationFlow::PathNode source, CorsPermissiveConfigurationFlow::PathNode sink -where CorsPermissiveConfigurationFlow::flowPath(source, sink) -select sink.getNode(), source, sink, "CORS Origin misconfiguration due to a $@.", source.getNode(), - "too permissive or user controlled value" diff --git a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationCustomizations.qll b/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationCustomizations.qll deleted file mode 100644 index 8876373a3d24..000000000000 --- a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationCustomizations.qll +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Provides default sources, sinks and sanitizers for reasoning about - * overly permissive CORS configurations, as well as - * extension points for adding your own. - */ - -import javascript -import Cors::Cors -import Apollo::Apollo - -/** Module containing sources, sinks, and sanitizers for overly permissive CORS configurations. */ -module CorsPermissiveConfiguration { - private newtype TFlowState = - TTaint() or - TTrueOrNull() or - TWildcard() - - /** A flow state to asociate with a tracked value. */ - class FlowState extends TFlowState { - /** Gets a string representation of this flow state. */ - string toString() { - this = TTaint() and result = "taint" - or - this = TTrueOrNull() and result = "true-or-null" - or - this = TWildcard() and result = "wildcard" - } - - deprecated DataFlow::FlowLabel toFlowLabel() { - this = TTaint() and result.isTaint() - or - this = TTrueOrNull() and result instanceof TrueAndNull - or - this = TWildcard() and result instanceof Wildcard - } - } - - /** Predicates for working with flow states. */ - module FlowState { - deprecated FlowState fromFlowLabel(DataFlow::FlowLabel label) { result.toFlowLabel() = label } - - /** A tainted value. */ - FlowState taint() { result = TTaint() } - - /** A `true` or `null` value. */ - FlowState trueOrNull() { result = TTrueOrNull() } - - /** A `"*"` value. */ - FlowState wildcard() { result = TWildcard() } - } - - /** - * A data flow source for permissive CORS configuration. - */ - abstract class Source extends DataFlow::Node { } - - /** - * A data flow sink for permissive CORS configuration. - */ - abstract class Sink extends DataFlow::Node { } - - /** - * A sanitizer for permissive CORS configuration. - */ - abstract class Sanitizer extends DataFlow::Node { } - - /** - * DEPRECATED: Use `ActiveThreatModelSource` from Concepts instead! - */ - deprecated class RemoteFlowSourceAsSource = ActiveThreatModelSourceAsSource; - - /** - * An active threat-model source, considered as a flow source. - */ - private class ActiveThreatModelSourceAsSource extends Source instanceof ActiveThreatModelSource { - ActiveThreatModelSourceAsSource() { not this instanceof ClientSideRemoteFlowSource } - } - - /** A flow label representing `true` and `null` values. */ - abstract deprecated class TrueAndNull extends DataFlow::FlowLabel { - TrueAndNull() { this = "TrueAndNull" } - } - - deprecated TrueAndNull truenullLabel() { any() } - - /** A flow label representing `*` value. */ - abstract deprecated class Wildcard extends DataFlow::FlowLabel { - Wildcard() { this = "Wildcard" } - } - - deprecated Wildcard wildcardLabel() { any() } - - /** An overly permissive value for `origin` (Apollo) */ - class TrueNullValue extends Source { - TrueNullValue() { this.mayHaveBooleanValue(true) or this.asExpr() instanceof NullLiteral } - } - - /** An overly permissive value for `origin` (Express) */ - class WildcardValue extends Source { - WildcardValue() { this.mayHaveStringValue("*") } - } - - /** - * The value of cors origin when initializing the application. - */ - class CorsApolloServer extends Sink, DataFlow::ValueNode { - CorsApolloServer() { - exists(ApolloServer agql | - this = - agql.getOptionArgument(0, "cors").getALocalSource().getAPropertyWrite("origin").getRhs() - ) - } - } - - /** - * The value of cors origin when initializing the application. - */ - class ExpressCors extends Sink, DataFlow::ValueNode { - ExpressCors() { - exists(CorsConfiguration config | this = config.getCorsConfiguration().getOrigin()) - } - } - - /** - * An express route setup configured with the `cors` package. - */ - class CorsConfiguration extends DataFlow::MethodCallNode { - Cors corsConfig; - - CorsConfiguration() { - exists(Express::RouteSetup setup | this = setup | - if setup.isUseCall() - then corsConfig = setup.getArgument(0) - else corsConfig = setup.getArgument(any(int i | i > 0)) - ) - } - - /** Gets the expression that configures `cors` on this route setup. */ - Cors getCorsConfiguration() { result = corsConfig } - } -} diff --git a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationQuery.qll b/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationQuery.qll deleted file mode 100644 index 3605a1adaa93..000000000000 --- a/javascript/ql/src/experimental/Security/CWE-942/CorsPermissiveConfigurationQuery.qll +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Provides a dataflow taint tracking configuration for reasoning - * about overly permissive CORS configurations. - * - * Note, for performance reasons: only import this file if - * `CorsPermissiveConfiguration::Configuration` is needed, - * otherwise `CorsPermissiveConfigurationCustomizations` should - * be imported instead. - */ - -import javascript -import CorsPermissiveConfigurationCustomizations::CorsPermissiveConfiguration -private import CorsPermissiveConfigurationCustomizations::CorsPermissiveConfiguration as CorsPermissiveConfiguration - -/** - * A data flow configuration for overly permissive CORS configuration. - */ -module CorsPermissiveConfigurationConfig implements DataFlow::StateConfigSig { - class FlowState = CorsPermissiveConfiguration::FlowState; - - predicate isSource(DataFlow::Node source, FlowState state) { - source instanceof TrueNullValue and state = FlowState::trueOrNull() - or - source instanceof WildcardValue and state = FlowState::wildcard() - or - source instanceof RemoteFlowSource and state = FlowState::taint() - } - - predicate isSink(DataFlow::Node sink, FlowState state) { - sink instanceof CorsApolloServer and state = [FlowState::taint(), FlowState::trueOrNull()] - or - sink instanceof ExpressCors and state = [FlowState::taint(), FlowState::wildcard()] - } - - predicate isBarrier(DataFlow::Node node) { node instanceof Sanitizer } - - predicate observeDiffInformedIncrementalMode() { any() } -} - -module CorsPermissiveConfigurationFlow = - TaintTracking::GlobalWithState; - -/** - * DEPRECATED. Use the `CorsPermissiveConfigurationFlow` module instead. - */ -deprecated class Configuration extends TaintTracking::Configuration { - Configuration() { this = "CorsPermissiveConfiguration" } - - override predicate isSource(DataFlow::Node source, DataFlow::FlowLabel label) { - CorsPermissiveConfigurationConfig::isSource(source, FlowState::fromFlowLabel(label)) - } - - override predicate isSink(DataFlow::Node sink, DataFlow::FlowLabel label) { - CorsPermissiveConfigurationConfig::isSink(sink, FlowState::fromFlowLabel(label)) - } - - override predicate isSanitizer(DataFlow::Node node) { - super.isSanitizer(node) or - CorsPermissiveConfigurationConfig::isBarrier(node) - } -} - -deprecated private class WildcardActivated extends DataFlow::FlowLabel, Wildcard { - WildcardActivated() { this = this } -} - -deprecated private class TrueAndNullActivated extends DataFlow::FlowLabel, TrueAndNull { - TrueAndNullActivated() { this = this } -} diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 3e8546ddfb9d..0b379a03d5bb 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.0.3 +version: 2.1.0 groups: - javascript - queries diff --git a/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.qlref b/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.qlref deleted file mode 100644 index 1e6a39679c0d..000000000000 --- a/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.qlref +++ /dev/null @@ -1 +0,0 @@ -./experimental/Security/CWE-942/CorsPermissiveConfiguration.ql \ No newline at end of file diff --git a/javascript/ql/test/library-tests/DataFlow/tests.expected b/javascript/ql/test/library-tests/DataFlow/tests.expected index 7655c8b9f84c..7ba6cbb60f39 100644 --- a/javascript/ql/test/library-tests/DataFlow/tests.expected +++ b/javascript/ql/test/library-tests/DataFlow/tests.expected @@ -1564,8 +1564,10 @@ sources | tst.js:50:14:53:3 | () {\\n ... et`\\n } | | tst.js:50:14:53:3 | return of constructor of class A | | tst.js:51:5:51:13 | super(42) | +| tst.js:57:1:57:9 | `x: ${x}` | | tst.js:58:1:58:3 | tag | | tst.js:58:1:58:13 | tag `x: ${x}` | +| tst.js:58:5:58:13 | `x: ${x}` | | tst.js:61:1:61:5 | ::o.m | | tst.js:61:3:61:5 | o.m | | tst.js:62:1:62:4 | o::g | diff --git a/javascript/ql/test/library-tests/FlowSummary/DataFlowConsistency.expected b/javascript/ql/test/library-tests/FlowSummary/DataFlowConsistency.expected index f3b3ca527c3b..51612c5b97ae 100644 --- a/javascript/ql/test/library-tests/FlowSummary/DataFlowConsistency.expected +++ b/javascript/ql/test/library-tests/FlowSummary/DataFlowConsistency.expected @@ -20,21 +20,6 @@ reverseRead | tst.js:267:28:267:31 | map3 | Origin of readStep is missing a PostUpdateNode. | argHasPostUpdate postWithInFlow -| file://:0:0:0:0 | [summary] to write: Argument[0] in _.tap | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[1] in Array method with flow into callback | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[1] in Array#filter | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[1] in Array#find / Array#findLast | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[1] in Array#flatMap | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[1] in Array#forEach / Map#forEach / Set#forEach | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[1] in Array#map | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[1] in Array#reduce / Array#reduceRight | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[2] in 'array.prototype.find' / 'array-find' | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[2] in Array.from(arg, callback, [thisArg]) | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[2] in _.reduce-like | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[this] in Array#flatMap | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[this] in Array#forEach / Map#forEach / Set#forEach | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[this] in Array#map | PostUpdateNode should not be the target of local flow. | -| file://:0:0:0:0 | [summary] to write: Argument[this] in Array#reduce / Array#reduceRight | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition diff --git a/javascript/ql/test/library-tests/FlowSummary/test.ql b/javascript/ql/test/library-tests/FlowSummary/test.ql index e8ca23a423cd..0e40dcdadb09 100644 --- a/javascript/ql/test/library-tests/FlowSummary/test.ql +++ b/javascript/ql/test/library-tests/FlowSummary/test.ql @@ -8,7 +8,7 @@ DataFlow::CallNode getACall(string name) { result.getCalleeNode().getALocalSource() = DataFlow::globalVarRef(name) } -module ConfigArg implements DataFlow::ConfigSig { +module FlowConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node node) { node = getACall("source") } predicate isSink(DataFlow::Node node) { node = getACall("sink").getAnArgument() } @@ -19,7 +19,7 @@ module ConfigArg implements DataFlow::ConfigSig { } } -module Configuration = DataFlow::Global; +module Flow = DataFlow::Global; class BasicBarrierGuard extends DataFlow::CallNode { BasicBarrierGuard() { this = getACall("isSafe") } @@ -32,5 +32,5 @@ class BasicBarrierGuard extends DataFlow::CallNode { deprecated class ConsistencyConfig extends ConsistencyConfiguration { ConsistencyConfig() { this = "ConsistencyConfig" } - override DataFlow::Node getAnAlert() { Configuration::flow(_, result) } + override DataFlow::Node getAnAlert() { Flow::flow(_, result) } } diff --git a/javascript/ql/test/library-tests/Portals/PortalEntry.expected b/javascript/ql/test/library-tests/Portals/PortalEntry.expected deleted file mode 100644 index b6f7ce881182..000000000000 --- a/javascript/ql/test/library-tests/Portals/PortalEntry.expected +++ /dev/null @@ -1,1715 +0,0 @@ -| (member Promise (root https://www.npmjs.com/package/bluebird)) | src/bluebird/index.js:9:19:9:25 | Promise | true | -| (member default (root https://www.npmjs.com/package/m2)) | src/m2/main.js:6:16:16:1 | class { ... y; }\\n} | true | -| (member exec (instance (member Promise (root https://www.npmjs.com/package/bluebird)))) | src/bluebird/index.js:2:15:2:18 | exec | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member f00 (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (member foo (root https://www.npmjs.com/package/cyclic))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (parameter 0 (parameter 0 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member f00 (return (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:5:11:5:13 | foo | true | -| (member foo (root https://www.npmjs.com/package/cyclic)) | src/cyclic/index.js:10:15:10:17 | foo | true | -| (member foo (root https://www.npmjs.com/package/m2)) | src/m2/main.js:1:8:4:1 | functio ... "hi";\\n} | true | -| (member foo (root https://www.npmjs.com/package/m4)) | src/m4/index.js:1:15:1:28 | function(x) {} | true | -| (member m (instance (member default (root https://www.npmjs.com/package/m2)))) | src/m2/main.js:11:4:13:3 | (x) {\\n ... e);\\n } | true | -| (member name (instance (member default (root https://www.npmjs.com/package/m2)))) | src/m2/main.js:8:17:8:20 | name | true | -| (member s (member default (root https://www.npmjs.com/package/m2))) | src/m2/main.js:15:11:15:27 | (y) { return y; } | true | -| (member then (instance (member Promise (root https://www.npmjs.com/package/bluebird)))) | src/bluebird/index.js:5:26:7:1 | functio ... ull);\\n} | true | -| (member x (parameter 0 (member foo (root https://www.npmjs.com/package/m2)))) | src/m3/tst2.js:5:10:5:10 | o | false | -| (member y (member x (parameter 0 (member foo (root https://www.npmjs.com/package/m2))))) | src/m3/tst2.js:3:6:3:8 | "?" | false | -| (member z (parameter 0 (member foo (root https://www.npmjs.com/package/m2)))) | src/m2/main.js:3:9:3:12 | "hi" | true | -| (parameter 0 (member String (global))) | src/m5/index.js:5:33:5:50 | fs.readFileSync(f) | true | -| (parameter 0 (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:4:7:4:10 | "me" | false | -| (parameter 0 (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:5:7:5:10 | "me" | false | -| (parameter 0 (member encode (root https://www.npmjs.com/package/base-64/base64.js))) | src/m5/index.js:5:26:5:51 | String( ... ync(f)) | false | -| (parameter 0 (member foo (root https://www.npmjs.com/package/m2))) | src/m3/tst2.js:5:5:5:12 | { x: o } | false | -| (parameter 0 (member log (member console (global)))) | src/m2/main.js:2:15:2:19 | p.x.y | true | -| (parameter 0 (member log (member console (global)))) | src/m2/main.js:12:17:12:35 | x + " " + this.name | true | -| (parameter 0 (member log (member console (global)))) | src/m3/index.js:3:43:3:61 | m1("Hello, world!") | true | -| (parameter 0 (member m (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:4:15:4:18 | "hi" | false | -| (parameter 0 (member m (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:4:15:4:18 | "hi" | true | -| (parameter 0 (member m (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:2:5:2:8 | "hi" | false | -| (parameter 0 (member m (return (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:4:15:4:18 | "hi" | false | -| (parameter 0 (member readFileSync (root https://www.npmjs.com/package/fs))) | src/m5/index.js:5:49:5:49 | f | false | -| (parameter 0 (member s (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:5:15:5:21 | "there" | false | -| (parameter 0 (member s (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:5:15:5:21 | "there" | true | -| (parameter 0 (member s (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:3:5:3:11 | "there" | false | -| (parameter 0 (member s (return (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:5:15:5:21 | "there" | false | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 0 (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:6:2:8 | foo | true | -| (parameter 0 (parameter 1 (member then (instance (member Promise (root https://www.npmjs.com/package/bluebird)))))) | src/bluebird/index.js:6:12:6:15 | null | true | -| (parameter 0 (root https://www.npmjs.com/package/m1)) | src/m3/index.js:3:46:3:60 | "Hello, world!" | false | -| (return (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member f00 (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member foo (root https://www.npmjs.com/package/cyclic))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (member s (member default (root https://www.npmjs.com/package/m2)))) | src/m2/main.js:15:24:15:24 | y | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (parameter 0 (parameter 0 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (member foo (root https://www.npmjs.com/package/cyclic)))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (return (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:3:10:3:12 | foo | true | -| (return (root https://www.npmjs.com/package/m1)) | src/m1/index.js:1:25:1:25 | x | true | -| (root https://www.npmjs.com/package/m1) | src/m1/index.js:1:18:1:25 | (x) => x | true | diff --git a/javascript/ql/test/library-tests/Portals/PortalEntry.ql b/javascript/ql/test/library-tests/Portals/PortalEntry.ql deleted file mode 100644 index 2e16b7bffb17..000000000000 --- a/javascript/ql/test/library-tests/Portals/PortalEntry.ql +++ /dev/null @@ -1,5 +0,0 @@ -import javascript -import semmle.javascript.dataflow.Portals - -from Portal p, boolean escapes -select p, p.getAnEntryNode(escapes), escapes diff --git a/javascript/ql/test/library-tests/Portals/PortalExit.expected b/javascript/ql/test/library-tests/Portals/PortalExit.expected deleted file mode 100644 index ed5a28d830eb..000000000000 --- a/javascript/ql/test/library-tests/Portals/PortalExit.expected +++ /dev/null @@ -1,1060 +0,0 @@ -| (global) | src/bluebird/index.js:1:1:1:0 | this | true | -| (global) | src/bluebird/tst.js:1:1:1:0 | this | true | -| (global) | src/cyclic/index.js:1:1:1:0 | this | true | -| (global) | src/m1/index.js:1:1:1:0 | this | true | -| (global) | src/m2/main.js:1:1:1:0 | this | true | -| (global) | src/m3/index.js:1:1:1:0 | this | true | -| (global) | src/m3/tst2.js:1:1:1:0 | this | true | -| (global) | src/m3/tst3.js:1:1:1:0 | this | true | -| (global) | src/m3/tst.js:1:1:1:0 | this | true | -| (global) | src/m4/index.js:1:1:1:0 | this | true | -| (global) | src/m5/index.js:1:1:1:0 | this | true | -| (instance (member Promise (root https://www.npmjs.com/package/bluebird))) | src/bluebird/index.js:1:1:1:0 | this | true | -| (instance (member Promise (root https://www.npmjs.com/package/bluebird))) | src/bluebird/index.js:5:1:5:17 | Promise.prototype | true | -| (instance (member Promise (root https://www.npmjs.com/package/bluebird))) | src/bluebird/index.js:5:26:5:25 | this | true | -| (instance (member Promise (root https://www.npmjs.com/package/bluebird))) | src/bluebird/tst.js:2:9:2:21 | new Promise() | true | -| (instance (member default (root https://www.npmjs.com/package/m2))) | src/m2/main.js:7:14:7:13 | this | true | -| (instance (member default (root https://www.npmjs.com/package/m2))) | src/m2/main.js:11:4:11:3 | this | true | -| (instance (member default (root https://www.npmjs.com/package/m2))) | src/m2/main.js:15:11:15:10 | this | true | -| (instance (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:4:1:4:11 | new A("me") | false | -| (instance (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:4:1:4:11 | new A("me") | true | -| (instance (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:5:1:5:11 | new A("me") | false | -| (instance (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:5:1:5:11 | new A("me") | true | -| (member String (global)) | src/m5/index.js:5:26:5:31 | String | true | -| (member console (global)) | src/m2/main.js:2:3:2:9 | console | true | -| (member console (global)) | src/m2/main.js:12:5:12:11 | console | true | -| (member console (global)) | src/m3/index.js:3:31:3:37 | console | true | -| (member default (root https://www.npmjs.com/package/m2)) | src/m3/tst3.js:1:8:1:8 | A | false | -| (member encode (root https://www.npmjs.com/package/base-64/base64.js)) | src/m5/index.js:5:12:5:24 | base64.encode | false | -| (member foo (root https://www.npmjs.com/package/m2)) | src/m3/tst2.js:1:10:1:12 | foo | false | -| (member log (member console (global))) | src/m2/main.js:2:3:2:13 | console.log | true | -| (member log (member console (global))) | src/m2/main.js:12:5:12:15 | console.log | true | -| (member log (member console (global))) | src/m3/index.js:3:31:3:41 | console.log | true | -| (member m (instance (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:4:1:4:13 | new A("me").m | false | -| (member m (instance (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:4:1:4:13 | new A("me").m | true | -| (member m (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:2:1:2:3 | A.m | false | -| (member m (return (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:4:1:4:13 | new A("me").m | false | -| (member name (instance (member default (root https://www.npmjs.com/package/m2)))) | src/m2/main.js:12:27:12:35 | this.name | true | -| (member readFileSync (root https://www.npmjs.com/package/fs)) | src/m5/index.js:5:33:5:47 | fs.readFileSync | false | -| (member s (instance (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:5:1:5:13 | new A("me").s | false | -| (member s (instance (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:5:1:5:13 | new A("me").s | true | -| (member s (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:3:1:3:3 | A.s | false | -| (member s (return (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:5:1:5:13 | new A("me").s | false | -| (member x (parameter 0 (member foo (root https://www.npmjs.com/package/m2)))) | src/m2/main.js:2:15:2:17 | p.x | true | -| (member y (member x (parameter 0 (member foo (root https://www.npmjs.com/package/m2))))) | src/m2/main.js:2:15:2:19 | p.x.y | true | -| (parameter 0 (member Promise (root https://www.npmjs.com/package/bluebird))) | src/bluebird/index.js:1:18:1:21 | exec | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member f00 (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (member foo (root https://www.npmjs.com/package/m2))) | src/m2/main.js:1:21:1:21 | p | true | -| (parameter 0 (member foo (root https://www.npmjs.com/package/m4))) | src/m4/index.js:1:24:1:24 | x | true | -| (parameter 0 (member m (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m2/main.js:11:5:11:5 | x | true | -| (parameter 0 (member s (member default (root https://www.npmjs.com/package/m2)))) | src/m2/main.js:15:12:15:12 | y | true | -| (parameter 0 (member then (instance (member Promise (root https://www.npmjs.com/package/bluebird))))) | src/bluebird/index.js:5:35:5:43 | fulfilled | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (parameter 0 (parameter 0 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (return (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:1:14:1:15 | cb | true | -| (parameter 0 (root https://www.npmjs.com/package/m1)) | src/m1/index.js:1:19:1:19 | x | true | -| (parameter 1 (member then (instance (member Promise (root https://www.npmjs.com/package/bluebird))))) | src/bluebird/index.js:5:46:5:53 | rejected | true | -| (return (member String (global))) | src/m5/index.js:5:26:5:51 | String( ... ync(f)) | true | -| (return (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:4:1:4:11 | new A("me") | false | -| (return (member default (root https://www.npmjs.com/package/m2))) | src/m3/tst3.js:5:1:5:11 | new A("me") | false | -| (return (member encode (root https://www.npmjs.com/package/base-64/base64.js))) | src/m5/index.js:5:12:5:52 | base64. ... nc(f))) | false | -| (return (member foo (root https://www.npmjs.com/package/m2))) | src/m3/tst2.js:5:1:5:13 | foo({ x: o }) | false | -| (return (member log (member console (global)))) | src/m2/main.js:2:3:2:20 | console.log(p.x.y) | true | -| (return (member log (member console (global)))) | src/m2/main.js:12:5:12:36 | console ... s.name) | true | -| (return (member log (member console (global)))) | src/m3/index.js:3:31:3:62 | console ... rld!")) | true | -| (return (member m (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:4:1:4:19 | new A("me").m("hi") | false | -| (return (member m (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:4:1:4:19 | new A("me").m("hi") | true | -| (return (member m (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:2:1:2:9 | A.m("hi") | false | -| (return (member m (return (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:4:1:4:19 | new A("me").m("hi") | false | -| (return (member readFileSync (root https://www.npmjs.com/package/fs))) | src/m5/index.js:5:33:5:50 | fs.readFileSync(f) | false | -| (return (member s (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:5:1:5:22 | new A(" ... there") | false | -| (return (member s (instance (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:5:1:5:22 | new A(" ... there") | true | -| (return (member s (member default (root https://www.npmjs.com/package/m2)))) | src/m3/tst3.js:3:1:3:12 | A.s("there") | false | -| (return (member s (return (member default (root https://www.npmjs.com/package/m2))))) | src/m3/tst3.js:5:1:5:22 | new A(" ... there") | false | -| (return (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member f00 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (parameter 0 (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member f00 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (parameter 0 (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member f00 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (parameter 0 (parameter 0 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (parameter 0 (parameter 0 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (parameter 0 (parameter 0 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (parameter 0 (parameter 0 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member f00 (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member f00 (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member f00 (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member f00 (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member f00 (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (parameter 0 (parameter 0 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (parameter 0 (parameter 0 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (return (member f00 (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (return (member f00 (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (return (parameter 0 (parameter 0 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (return (return (member f00 (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 0 (return (return (return (return (return (return (member foo (root https://www.npmjs.com/package/cyclic)))))))))) | src/cyclic/index.js:2:3:2:9 | cb(foo) | true | -| (return (parameter 1 (member then (instance (member Promise (root https://www.npmjs.com/package/bluebird)))))) | src/bluebird/index.js:6:3:6:16 | rejected(null) | true | -| (return (root https://www.npmjs.com/package/m1)) | src/m3/index.js:3:43:3:61 | m1("Hello, world!") | false | -| (root https://www.npmjs.com/package/base-64/base64.js) | src/m5/index.js:2:14:2:41 | require ... 64.js") | false | -| (root https://www.npmjs.com/package/fs) | src/m5/index.js:1:12:1:24 | require("fs") | false | -| (root https://www.npmjs.com/package/m1) | src/m3/index.js:1:10:1:22 | require("m1") | false | -| (root https://www.npmjs.com/package/m2) | src/m3/tst2.js:1:1:1:25 | import ... m "m2"; | false | -| (root https://www.npmjs.com/package/m2) | src/m3/tst3.js:1:1:1:19 | import A from "m2"; | false | diff --git a/javascript/ql/test/library-tests/Portals/PortalExit.ql b/javascript/ql/test/library-tests/Portals/PortalExit.ql deleted file mode 100644 index c8215261fd09..000000000000 --- a/javascript/ql/test/library-tests/Portals/PortalExit.ql +++ /dev/null @@ -1,5 +0,0 @@ -import javascript -import semmle.javascript.dataflow.Portals - -from Portal p, boolean isRemote -select p, p.getAnExitNode(isRemote), isRemote diff --git a/javascript/ql/test/library-tests/Portals/src/bluebird/index.js b/javascript/ql/test/library-tests/Portals/src/bluebird/index.js deleted file mode 100644 index 55534a29ee10..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/bluebird/index.js +++ /dev/null @@ -1,9 +0,0 @@ -function Promise(exec) { - this.exec = exec; -} - -Promise.prototype.then = function(fulfilled, rejected) { - rejected(null); -}; - -exports.Promise = Promise; diff --git a/javascript/ql/test/library-tests/Portals/src/bluebird/package.json b/javascript/ql/test/library-tests/Portals/src/bluebird/package.json deleted file mode 100644 index c87227dd7810..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/bluebird/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "bluebird" -} diff --git a/javascript/ql/test/library-tests/Portals/src/bluebird/tst.js b/javascript/ql/test/library-tests/Portals/src/bluebird/tst.js deleted file mode 100644 index 9de51f325838..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/bluebird/tst.js +++ /dev/null @@ -1,2 +0,0 @@ -var Promise= require('./index').Promise; -var p = new Promise(); diff --git a/javascript/ql/test/library-tests/Portals/src/cyclic/index.js b/javascript/ql/test/library-tests/Portals/src/cyclic/index.js deleted file mode 100644 index cf6f60871ce1..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/cyclic/index.js +++ /dev/null @@ -1,10 +0,0 @@ -function foo(cb) { - cb(foo); - return foo; -} -foo.f00 = foo; - -foo(foo); -foo(foo()); - -exports.foo = foo; diff --git a/javascript/ql/test/library-tests/Portals/src/cyclic/package.json b/javascript/ql/test/library-tests/Portals/src/cyclic/package.json deleted file mode 100644 index f842eba9efd1..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/cyclic/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "cyclic" -} diff --git a/javascript/ql/test/library-tests/Portals/src/m1/index.js b/javascript/ql/test/library-tests/Portals/src/m1/index.js deleted file mode 100644 index b6996b7326d6..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m1/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = (x) => x; diff --git a/javascript/ql/test/library-tests/Portals/src/m1/package.json b/javascript/ql/test/library-tests/Portals/src/m1/package.json deleted file mode 100644 index a055bb659b39..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m1/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "m1" -} diff --git a/javascript/ql/test/library-tests/Portals/src/m2/main.js b/javascript/ql/test/library-tests/Portals/src/m2/main.js deleted file mode 100644 index 43f42b1ff830..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m2/main.js +++ /dev/null @@ -1,16 +0,0 @@ -export function foo(p) { - console.log(p.x.y); - p.z = "hi"; -} - -export default class { - constructor(name) { - this.name = name; - } - - m(x) { - console.log(x + " " + this.name); - } - - static s(y) { return y; } -}; diff --git a/javascript/ql/test/library-tests/Portals/src/m2/package.json b/javascript/ql/test/library-tests/Portals/src/m2/package.json deleted file mode 100644 index 6a14139b8ebd..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m2/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "m2", - "main": "main.js" -} diff --git a/javascript/ql/test/library-tests/Portals/src/m3/index.js b/javascript/ql/test/library-tests/Portals/src/m3/index.js deleted file mode 100644 index c677a0e8f863..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m3/index.js +++ /dev/null @@ -1,3 +0,0 @@ -var m1 = require("m1"); - -module.exports = function() { console.log(m1("Hello, world!")); }; diff --git a/javascript/ql/test/library-tests/Portals/src/m3/package.json b/javascript/ql/test/library-tests/Portals/src/m3/package.json deleted file mode 100644 index 6644e5c989c3..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m3/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "client", - "private": true, - "dependencies": { - "m1": "*", - "m2": "*" - } -} diff --git a/javascript/ql/test/library-tests/Portals/src/m3/tst.js b/javascript/ql/test/library-tests/Portals/src/m3/tst.js deleted file mode 100644 index dea4b2f92018..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m3/tst.js +++ /dev/null @@ -1 +0,0 @@ -require(".")(); diff --git a/javascript/ql/test/library-tests/Portals/src/m3/tst2.js b/javascript/ql/test/library-tests/Portals/src/m3/tst2.js deleted file mode 100644 index ae963ef64586..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m3/tst2.js +++ /dev/null @@ -1,5 +0,0 @@ -import { foo } from "m2"; -var o = { - y: "?" -}; -foo({ x: o }); diff --git a/javascript/ql/test/library-tests/Portals/src/m3/tst3.js b/javascript/ql/test/library-tests/Portals/src/m3/tst3.js deleted file mode 100644 index 33f1bce997b4..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m3/tst3.js +++ /dev/null @@ -1,5 +0,0 @@ -import A from "m2"; -A.m("hi"); -A.s("there"); -new A("me").m("hi"); -new A("me").s("there"); diff --git a/javascript/ql/test/library-tests/Portals/src/m4/index.js b/javascript/ql/test/library-tests/Portals/src/m4/index.js deleted file mode 100644 index 71247fc87d9a..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m4/index.js +++ /dev/null @@ -1 +0,0 @@ -exports.foo = function(x) {}; diff --git a/javascript/ql/test/library-tests/Portals/src/m4/package.json b/javascript/ql/test/library-tests/Portals/src/m4/package.json deleted file mode 100644 index a3bb655cba4b..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m4/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "name": "m4" -} diff --git a/javascript/ql/test/library-tests/Portals/src/m5/index.js b/javascript/ql/test/library-tests/Portals/src/m5/index.js deleted file mode 100644 index cc467c97fb85..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m5/index.js +++ /dev/null @@ -1,6 +0,0 @@ -const fs = require("fs"), - base64 = require("base-64/base64.js"); - -module.exports.readBase64 = function (f) { - return base64.encode(String(fs.readFileSync(f))); -}; diff --git a/javascript/ql/test/library-tests/Portals/src/m5/package.json b/javascript/ql/test/library-tests/Portals/src/m5/package.json deleted file mode 100644 index 90f440499e93..000000000000 --- a/javascript/ql/test/library-tests/Portals/src/m5/package.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "m5", - "dependencies": { - "base-64": "*" - } -} diff --git a/javascript/ql/test/library-tests/TripleDot/array-with.js b/javascript/ql/test/library-tests/TripleDot/array-with.js new file mode 100644 index 000000000000..73c09a434ace --- /dev/null +++ b/javascript/ql/test/library-tests/TripleDot/array-with.js @@ -0,0 +1,25 @@ +function t1() { + const arr = [1, 2, 3]; + const newArr = arr.with(1, source('with.1')); + sink(newArr[1]); // $ hasValueFlow=with.1 +} + +function t2() { + const arr = [source('with.2.1'), 2, source('with.2.3')]; + const newArr = arr.with(1, 'replaced'); + sink(newArr[0]); // $ hasValueFlow=with.2.1 + sink(newArr[2]); // $ hasValueFlow=with.2.3 +} + +function t3() { + const arr = [1, 2, 3]; + const index = source('with.3.index'); + const newArr = arr.with(index, 'new value'); + // No assertions here as the index is tainted, not the value +} + +function t4() { + const arr = [1, 2, 3]; + const newArr = arr.with(1, source('with.4')); + sink(arr[1]); // This should NOT have value flow as with() returns a new array +} diff --git a/javascript/ql/test/library-tests/TripleDot/promise-try.js b/javascript/ql/test/library-tests/TripleDot/promise-try.js new file mode 100644 index 000000000000..9c96ee73426c --- /dev/null +++ b/javascript/ql/test/library-tests/TripleDot/promise-try.js @@ -0,0 +1,29 @@ +async function t1() { + const promise = Promise.try(() => { + return source('try.1'); + }); + sink(await promise); // $ hasValueFlow=try.1 +} + +async function t2() { + const promise = Promise.try((x) => { + return x + }, source('try.2')); + sink(await promise); // $ hasValueFlow=try.2 +} + +async function t3() { + const promise = Promise.try((x) => { + throw x; + }, source('try.3')); + promise.catch(err => { + sink(err); // $ hasValueFlow=try.3 + }); +} + +async function t4() { + const promise = Promise.try((x, y) => { + return y; + }, source('try.4.1'), source('try.4.2')); + sink(await promise); // $ hasValueFlow=try.4.2 +} diff --git a/javascript/ql/test/library-tests/TypeScript/ImportDefer/test-js.js b/javascript/ql/test/library-tests/TypeScript/ImportDefer/test-js.js new file mode 100644 index 000000000000..a3a80435538e --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ImportDefer/test-js.js @@ -0,0 +1,3 @@ +import defer * as deferred from "somewhere"; +import * as normal from "somewhere"; +import defer from "somewhere"; diff --git a/javascript/ql/test/library-tests/TypeScript/ImportDefer/test.expected b/javascript/ql/test/library-tests/TypeScript/ImportDefer/test.expected new file mode 100644 index 000000000000..c5d2d2e3f3db --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ImportDefer/test.expected @@ -0,0 +1,2 @@ +| test-js.js:1:1:1:44 | import ... where"; | +| tst.ts:1:1:1:44 | import ... where"; | diff --git a/javascript/ql/test/library-tests/TypeScript/ImportDefer/test.ql b/javascript/ql/test/library-tests/TypeScript/ImportDefer/test.ql new file mode 100644 index 000000000000..b512330a0966 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ImportDefer/test.ql @@ -0,0 +1,3 @@ +import javascript + +query predicate deferredImports(ImportDeclaration decl) { decl.isDeferredImport() } diff --git a/javascript/ql/test/library-tests/TypeScript/ImportDefer/tst.ts b/javascript/ql/test/library-tests/TypeScript/ImportDefer/tst.ts new file mode 100644 index 000000000000..513394b4c145 --- /dev/null +++ b/javascript/ql/test/library-tests/TypeScript/ImportDefer/tst.ts @@ -0,0 +1,4 @@ +import defer * as deferred from "somewhere"; +import type * as t from "somewhere"; +import * as normal from "somewhere"; +import defer from "somewhere"; diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmptyName/test.ts b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmptyName/test.ts index 3082f40600f6..8e25b67918aa 100644 --- a/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmptyName/test.ts +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/EmptyName/test.ts @@ -1,9 +1,9 @@ type Mapped = { -     [mk in MK]: string + [mk in MK]: string }; export function fn(ev: Mapped) { -    const props: Mapped = { -        ...ev -    }; + const props: Mapped = { + ...ev + }; } diff --git a/javascript/ql/test/library-tests/TypeScript/RegressionTests/SemicolonInName/test.ts b/javascript/ql/test/library-tests/TypeScript/RegressionTests/SemicolonInName/test.ts index 1726e5abafbe..a3ed20468361 100644 --- a/javascript/ql/test/library-tests/TypeScript/RegressionTests/SemicolonInName/test.ts +++ b/javascript/ql/test/library-tests/TypeScript/RegressionTests/SemicolonInName/test.ts @@ -1,9 +1,9 @@ type Mapped = { -     [mk in MK]: string + [mk in MK]: string }; export function fn(ev: Mapped) { -    const props: Mapped = { -        ...ev -    }; + const props: Mapped = { + ...ev + }; } diff --git a/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.expected b/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.expected index 168f5ec5ace4..95ee8fe452b8 100644 --- a/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.expected +++ b/javascript/ql/test/library-tests/frameworks/AsyncPackage/AsyncTaintTracking.expected @@ -1,12 +1,24 @@ legacyDataFlowDifference -| each.js:11:9:11:16 | source() | each.js:13:12:13:15 | item | only flow with OLD data flow library | -| map.js:10:13:10:20 | source() | map.js:12:14:12:17 | item | only flow with OLD data flow library | -| map.js:26:13:26:20 | source() | map.js:28:27:28:32 | result | only flow with OLD data flow library | -| sortBy.js:10:22:10:29 | source() | sortBy.js:12:27:12:32 | result | only flow with OLD data flow library | +| each.js:11:9:11:16 | source() | each.js:13:12:13:15 | item | only flow with NEW data flow library | +| map.js:14:13:14:20 | source() | map.js:16:14:16:17 | item | only flow with NEW data flow library | +| map.js:30:13:30:20 | source() | map.js:32:27:32:32 | result | only flow with NEW data flow library | +| map.js:40:13:40:20 | source() | map.js:11:10:11:10 | x | only flow with NEW data flow library | +| map.js:42:12:42:19 | source() | map.js:11:10:11:10 | x | only flow with NEW data flow library | +| map.js:44:16:44:23 | source() | map.js:11:10:11:10 | x | only flow with NEW data flow library | +| map.js:46:18:46:25 | source() | map.js:11:10:11:10 | x | only flow with NEW data flow library | +| sortBy.js:10:22:10:29 | source() | sortBy.js:12:27:12:32 | result | only flow with NEW data flow library | #select -| map.js:20:19:20:26 | source() | map.js:23:27:23:32 | result | -| waterfall.js:8:30:8:37 | source() | waterfall.js:11:12:11:16 | taint | -| waterfall.js:8:30:8:37 | source() | waterfall.js:20:10:20:14 | taint | -| waterfall.js:28:18:28:25 | source() | waterfall.js:39:10:39:12 | err | -| waterfall.js:46:22:46:29 | source() | waterfall.js:49:12:49:16 | taint | -| waterfall.js:46:22:46:29 | source() | waterfall.js:55:10:55:14 | taint | +| each.js:11:9:11:16 | source() | each.js:13:12:13:15 | item | +| map.js:14:13:14:20 | source() | map.js:16:14:16:17 | item | +| map.js:24:19:24:26 | source() | map.js:27:27:27:32 | result | +| map.js:30:13:30:20 | source() | map.js:32:27:32:32 | result | +| map.js:40:13:40:20 | source() | map.js:11:10:11:10 | x | +| map.js:42:12:42:19 | source() | map.js:11:10:11:10 | x | +| map.js:44:16:44:23 | source() | map.js:11:10:11:10 | x | +| map.js:46:18:46:25 | source() | map.js:11:10:11:10 | x | +| sortBy.js:10:22:10:29 | source() | sortBy.js:12:27:12:32 | result | +| waterfall.js:16:30:16:37 | source() | waterfall.js:19:12:19:16 | taint | +| waterfall.js:16:30:16:37 | source() | waterfall.js:28:10:28:14 | taint | +| waterfall.js:36:18:36:25 | source() | waterfall.js:47:10:47:12 | err | +| waterfall.js:54:22:54:29 | source() | waterfall.js:57:12:57:16 | taint | +| waterfall.js:54:22:54:29 | source() | waterfall.js:63:10:63:14 | taint | diff --git a/javascript/ql/test/library-tests/frameworks/AsyncPackage/map.js b/javascript/ql/test/library-tests/frameworks/AsyncPackage/map.js index ed7e64b01fae..b1e9ecc883b6 100644 --- a/javascript/ql/test/library-tests/frameworks/AsyncPackage/map.js +++ b/javascript/ql/test/library-tests/frameworks/AsyncPackage/map.js @@ -7,6 +7,10 @@ function sink(x) { console.log(x) } +function call_sink(x) { + sink(x) +} + async_.map([source()], (item, cb) => { sink(item), // NOT OK @@ -32,3 +36,12 @@ async_.map(['safe'], (item, cb) => cb(null, item), (err, result) => sink(result) // OK ); + +async_.map([source()], call_sink) // NOT OK + +async_.map(source().prop, call_sink) // NOT OK + +async_.map({a: source()}, call_sink) // NOT OK + +async_.mapLimit([source()], 1, call_sink) // NOT OK + diff --git a/javascript/ql/test/library-tests/frameworks/AsyncPackage/waterfall.js b/javascript/ql/test/library-tests/frameworks/AsyncPackage/waterfall.js index 439ac48674a6..8554d048d988 100644 --- a/javascript/ql/test/library-tests/frameworks/AsyncPackage/waterfall.js +++ b/javascript/ql/test/library-tests/frameworks/AsyncPackage/waterfall.js @@ -1,7 +1,15 @@ let async_ = require('async'); let waterfall = require('a-sync-waterfall'); -var source, sink, somethingWrong; +function source() { + return 'TAINT' +} + +function sink(x) { + console.log(x) +} + +var somethingWrong; async_.waterfall([ function(callback) { diff --git a/javascript/ql/test/library-tests/frameworks/xUnit/tests.expected b/javascript/ql/test/library-tests/frameworks/xUnit/tests.expected index 5d30921408b5..266e9e31e6ff 100644 --- a/javascript/ql/test/library-tests/frameworks/xUnit/tests.expected +++ b/javascript/ql/test/library-tests/frameworks/xUnit/tests.expected @@ -3,10 +3,10 @@ xUnitAnnotationfrom | tst.js:5:5:5:13 | [Fixture] | tst.js:6:5:13:5 | functio ... }\\n } | | tst.js:7:9:7:14 | [Fact] | tst.js:8:9:12:9 | functio ... } | | tst.js:16:1:16:43 | [Import ... t.js")] | tst.js:18:1:22:2 | Test.xU ... ..]\\n\\n}; | -| tst.js:17:1:17:9 | Fixture | tst.js:18:1:22:2 | Test.xU ... ..]\\n\\n}; | +| tst.js:17:2:17:8 | Fixture | tst.js:18:1:22:2 | Test.xU ... ..]\\n\\n}; | | tst.js:24:1:24:9 | [Fixture] | tst.js:25:1:34:2 | Test.Ex ... }\\n}; | | tst.js:27:5:29:7 | [Import ... })] | tst.js:31:5:33:5 | functio ... ]\\n } | -| tst.js:30:5:30:10 | Fact | tst.js:31:5:33:5 | functio ... ]\\n } | +| tst.js:30:6:30:9 | Fact | tst.js:31:5:33:5 | functio ... ]\\n } | xUnitAttribute | tst.js:3:2:3:8 | Fixture | Fixture | 0 | | tst.js:5:6:5:12 | Fixture | Fixture | 0 | @@ -24,7 +24,7 @@ xUnitFixture | tst.js:4:20:14:1 | functio ... }\\n} | tst.js:3:1:3:9 | [Fixture] | | tst.js:6:5:13:5 | functio ... }\\n } | tst.js:5:5:5:13 | [Fixture] | | tst.js:18:24:22:1 | functio ... ...]\\n\\n} | tst.js:16:1:16:43 | [Import ... t.js")] | -| tst.js:18:24:22:1 | functio ... ...]\\n\\n} | tst.js:17:1:17:9 | Fixture | +| tst.js:18:24:22:1 | functio ... ...]\\n\\n} | tst.js:17:2:17:8 | Fixture | | tst.js:25:21:34:1 | functio ... }\\n} | tst.js:24:1:24:9 | [Fixture] | xUnitTarget | tst.js:4:1:14:2 | Test.Ex ... }\\n}; | diff --git a/javascript/ql/test/query-tests/LanguageFeatures/LengthComparisonOffByOne/tst.js b/javascript/ql/test/query-tests/LanguageFeatures/LengthComparisonOffByOne/tst.js index 6b214c9b0423..bd284d2c0276 100644 --- a/javascript/ql/test/query-tests/LanguageFeatures/LengthComparisonOffByOne/tst.js +++ b/javascript/ql/test/query-tests/LanguageFeatures/LengthComparisonOffByOne/tst.js @@ -55,3 +55,11 @@ function badContains(a, elt) { return true; return false; } + +// OK - incorrect upper bound, but extra check +function badContains2(a, elt) { + for (let i = 0; i <= a.length; ++i) + if (i < a.length && a[i] === elt) + return true; + return false; +} diff --git a/javascript/ql/test/query-tests/Security/CWE-078/CommandInjection/CommandInjection.expected b/javascript/ql/test/query-tests/Security/CWE-078/CommandInjection/CommandInjection.expected index dc9c65822ba0..f1d547bdfb1c 100644 --- a/javascript/ql/test/query-tests/Security/CWE-078/CommandInjection/CommandInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-078/CommandInjection/CommandInjection.expected @@ -82,6 +82,33 @@ | other.js:28:27:28:29 | cmd | other.js:5:25:5:31 | req.url | other.js:28:27:28:29 | cmd | This command line depends on a $@. | other.js:5:25:5:31 | req.url | user-provided value | | other.js:30:33:30:35 | cmd | other.js:5:25:5:31 | req.url | other.js:30:33:30:35 | cmd | This command line depends on a $@. | other.js:5:25:5:31 | req.url | user-provided value | | other.js:34:44:34:46 | cmd | other.js:5:25:5:31 | req.url | other.js:34:44:34:46 | cmd | This command line depends on a $@. | other.js:5:25:5:31 | req.url | user-provided value | +| promisification.js:9:13:9:21 | code.code | promisification.js:15:18:15:25 | req.body | promisification.js:9:13:9:21 | code.code | This command line depends on a $@. | promisification.js:15:18:15:25 | req.body | user-provided value | +| promisification.js:24:22:24:25 | code | promisification.js:21:18:21:25 | req.body | promisification.js:24:22:24:25 | code | This command line depends on a $@. | promisification.js:21:18:21:25 | req.body | user-provided value | +| promisification.js:31:24:31:27 | code | promisification.js:30:18:30:25 | req.body | promisification.js:31:24:31:27 | code | This command line depends on a $@. | promisification.js:30:18:30:25 | req.body | user-provided value | +| promisification.js:40:21:40:24 | code | promisification.js:37:18:37:25 | req.body | promisification.js:40:21:40:24 | code | This command line depends on a $@. | promisification.js:37:18:37:25 | req.body | user-provided value | +| promisification.js:43:24:43:27 | code | promisification.js:37:18:37:25 | req.body | promisification.js:43:24:43:27 | code | This command line depends on a $@. | promisification.js:37:18:37:25 | req.body | user-provided value | +| promisification.js:52:21:52:24 | code | promisification.js:49:18:49:25 | req.body | promisification.js:52:21:52:24 | code | This command line depends on a $@. | promisification.js:49:18:49:25 | req.body | user-provided value | +| promisification.js:55:15:55:18 | code | promisification.js:49:18:49:25 | req.body | promisification.js:55:15:55:18 | code | This command line depends on a $@. | promisification.js:49:18:49:25 | req.body | user-provided value | +| promisification.js:65:21:65:23 | cmd | promisification.js:61:15:61:22 | req.body | promisification.js:65:21:65:23 | cmd | This command line depends on a $@. | promisification.js:61:15:61:22 | req.body | user-provided value | +| promisification.js:69:20:69:22 | cmd | promisification.js:61:15:61:22 | req.body | promisification.js:69:20:69:22 | cmd | This command line depends on a $@. | promisification.js:61:15:61:22 | req.body | user-provided value | +| promisification.js:74:26:74:28 | cmd | promisification.js:61:15:61:22 | req.body | promisification.js:74:26:74:28 | cmd | This command line depends on a $@. | promisification.js:61:15:61:22 | req.body | user-provided value | +| promisification.js:77:24:77:26 | cmd | promisification.js:61:15:61:22 | req.body | promisification.js:77:24:77:26 | cmd | This command line depends on a $@. | promisification.js:61:15:61:22 | req.body | user-provided value | +| promisification.js:78:28:78:30 | cmd | promisification.js:61:15:61:22 | req.body | promisification.js:78:28:78:30 | cmd | This command line depends on a $@. | promisification.js:61:15:61:22 | req.body | user-provided value | +| promisification.js:79:25:79:27 | cmd | promisification.js:61:15:61:22 | req.body | promisification.js:79:25:79:27 | cmd | This command line depends on a $@. | promisification.js:61:15:61:22 | req.body | user-provided value | +| promisification.js:83:36:83:39 | code | promisification.js:61:15:61:22 | req.body | promisification.js:83:36:83:39 | code | This command line depends on a $@. | promisification.js:61:15:61:22 | req.body | user-provided value | +| promisification.js:100:23:100:26 | code | promisification.js:99:18:99:25 | req.body | promisification.js:100:23:100:26 | code | This command line depends on a $@. | promisification.js:99:18:99:25 | req.body | user-provided value | +| promisification.js:101:27:101:30 | code | promisification.js:99:18:99:25 | req.body | promisification.js:101:27:101:30 | code | This command line depends on a $@. | promisification.js:99:18:99:25 | req.body | user-provided value | +| promisification.js:102:27:102:30 | code | promisification.js:99:18:99:25 | req.body | promisification.js:102:27:102:30 | code | This command line depends on a $@. | promisification.js:99:18:99:25 | req.body | user-provided value | +| promisification.js:106:24:106:27 | code | promisification.js:99:18:99:25 | req.body | promisification.js:106:24:106:27 | code | This command line depends on a $@. | promisification.js:99:18:99:25 | req.body | user-provided value | +| promisification.js:109:24:109:27 | code | promisification.js:99:18:99:25 | req.body | promisification.js:109:24:109:27 | code | This command line depends on a $@. | promisification.js:99:18:99:25 | req.body | user-provided value | +| promisification.js:124:17:124:19 | cmd | promisification.js:114:18:114:25 | req.body | promisification.js:124:17:124:19 | cmd | This command line depends on a $@. | promisification.js:114:18:114:25 | req.body | user-provided value | +| promisification.js:133:21:133:24 | code | promisification.js:130:18:130:25 | req.body | promisification.js:133:21:133:24 | code | This command line depends on a $@. | promisification.js:130:18:130:25 | req.body | user-provided value | +| promisification.js:136:15:136:18 | code | promisification.js:130:18:130:25 | req.body | promisification.js:136:15:136:18 | code | This command line depends on a $@. | promisification.js:130:18:130:25 | req.body | user-provided value | +| promisification.js:144:21:144:24 | code | promisification.js:141:18:141:25 | req.body | promisification.js:144:21:144:24 | code | This command line depends on a $@. | promisification.js:141:18:141:25 | req.body | user-provided value | +| promisification.js:147:15:147:18 | code | promisification.js:141:18:141:25 | req.body | promisification.js:147:15:147:18 | code | This command line depends on a $@. | promisification.js:141:18:141:25 | req.body | user-provided value | +| promisification.js:150:24:150:27 | code | promisification.js:141:18:141:25 | req.body | promisification.js:150:24:150:27 | code | This command line depends on a $@. | promisification.js:141:18:141:25 | req.body | user-provided value | +| promisification.js:151:28:151:31 | code | promisification.js:141:18:141:25 | req.body | promisification.js:151:28:151:31 | code | This command line depends on a $@. | promisification.js:141:18:141:25 | req.body | user-provided value | +| promisification.js:152:25:152:28 | code | promisification.js:141:18:141:25 | req.body | promisification.js:152:25:152:28 | code | This command line depends on a $@. | promisification.js:141:18:141:25 | req.body | user-provided value | | third-party-command-injection.js:6:21:6:27 | command | third-party-command-injection.js:5:20:5:26 | command | third-party-command-injection.js:6:21:6:27 | command | This command line depends on a $@. | third-party-command-injection.js:5:20:5:26 | command | user-provided value | edges | actions.js:8:9:8:13 | title | actions.js:9:16:9:20 | title | provenance | | @@ -259,6 +286,59 @@ edges | other.js:5:9:5:11 | cmd | other.js:34:44:34:46 | cmd | provenance | | | other.js:5:15:5:38 | url.par ... , true) | other.js:5:9:5:11 | cmd | provenance | | | other.js:5:25:5:31 | req.url | other.js:5:15:5:38 | url.par ... , true) | provenance | | +| promisification.js:8:21:8:24 | code | promisification.js:9:13:9:16 | code | provenance | | +| promisification.js:9:13:9:16 | code | promisification.js:9:13:9:21 | code.code | provenance | | +| promisification.js:15:11:15:14 | code | promisification.js:16:15:16:18 | code | provenance | | +| promisification.js:15:18:15:25 | req.body | promisification.js:15:11:15:14 | code | provenance | | +| promisification.js:16:15:16:18 | code | promisification.js:8:21:8:24 | code | provenance | | +| promisification.js:21:11:21:14 | code | promisification.js:24:22:24:25 | code | provenance | | +| promisification.js:21:18:21:25 | req.body | promisification.js:21:11:21:14 | code | provenance | | +| promisification.js:30:11:30:14 | code | promisification.js:31:24:31:27 | code | provenance | | +| promisification.js:30:18:30:25 | req.body | promisification.js:30:11:30:14 | code | provenance | | +| promisification.js:37:11:37:14 | code | promisification.js:40:21:40:24 | code | provenance | | +| promisification.js:37:11:37:14 | code | promisification.js:43:24:43:27 | code | provenance | | +| promisification.js:37:18:37:25 | req.body | promisification.js:37:11:37:14 | code | provenance | | +| promisification.js:49:11:49:14 | code | promisification.js:52:21:52:24 | code | provenance | | +| promisification.js:49:11:49:14 | code | promisification.js:55:15:55:18 | code | provenance | | +| promisification.js:49:18:49:25 | req.body | promisification.js:49:11:49:14 | code | provenance | | +| promisification.js:61:9:61:11 | cmd | promisification.js:65:21:65:23 | cmd | provenance | | +| promisification.js:61:9:61:11 | cmd | promisification.js:69:20:69:22 | cmd | provenance | | +| promisification.js:61:9:61:11 | cmd | promisification.js:74:26:74:28 | cmd | provenance | | +| promisification.js:61:9:61:11 | cmd | promisification.js:77:24:77:26 | cmd | provenance | | +| promisification.js:61:9:61:11 | cmd | promisification.js:78:28:78:30 | cmd | provenance | | +| promisification.js:61:9:61:11 | cmd | promisification.js:79:25:79:27 | cmd | provenance | | +| promisification.js:61:9:61:11 | cmd | promisification.js:89:12:89:14 | cmd | provenance | | +| promisification.js:61:15:61:22 | req.body | promisification.js:61:9:61:11 | cmd | provenance | | +| promisification.js:81:34:81:37 | code | promisification.js:83:36:83:39 | code | provenance | | +| promisification.js:89:12:89:14 | cmd | promisification.js:81:34:81:37 | code | provenance | | +| promisification.js:99:11:99:14 | code | promisification.js:100:23:100:26 | code | provenance | | +| promisification.js:99:11:99:14 | code | promisification.js:101:27:101:30 | code | provenance | | +| promisification.js:99:11:99:14 | code | promisification.js:102:27:102:30 | code | provenance | | +| promisification.js:99:11:99:14 | code | promisification.js:106:24:106:27 | code | provenance | | +| promisification.js:99:11:99:14 | code | promisification.js:109:24:109:27 | code | provenance | | +| promisification.js:99:18:99:25 | req.body | promisification.js:99:11:99:14 | code | provenance | | +| promisification.js:114:11:114:14 | code | promisification.js:122:42:122:45 | code | provenance | | +| promisification.js:114:18:114:25 | req.body | promisification.js:114:11:114:14 | code | provenance | | +| promisification.js:116:32:116:34 | cmd | promisification.js:117:16:119:10 | new Pro ... }) [PromiseValue] | provenance | | +| promisification.js:116:32:116:34 | cmd | promisification.js:118:21:118:23 | cmd | provenance | | +| promisification.js:118:13:118:19 | [post update] resolve [resolve-value] | promisification.js:117:29:117:35 | resolve [Return] [resolve-value] | provenance | | +| promisification.js:118:21:118:23 | cmd | promisification.js:118:13:118:19 | [post update] resolve [resolve-value] | provenance | | +| promisification.js:122:11:122:20 | cmdPromise [PromiseValue] | promisification.js:123:17:123:26 | cmdPromise [PromiseValue] | provenance | | +| promisification.js:122:24:122:46 | createE ... e(code) [PromiseValue] | promisification.js:122:11:122:20 | cmdPromise [PromiseValue] | provenance | | +| promisification.js:122:42:122:45 | code | promisification.js:116:32:116:34 | cmd | provenance | | +| promisification.js:122:42:122:45 | code | promisification.js:122:24:122:46 | createE ... e(code) [PromiseValue] | provenance | | +| promisification.js:123:5:123:27 | maybe(n ... romise) [PromiseValue] | promisification.js:123:34:123:36 | cmd | provenance | | +| promisification.js:123:17:123:26 | cmdPromise [PromiseValue] | promisification.js:123:5:123:27 | maybe(n ... romise) [PromiseValue] | provenance | | +| promisification.js:123:34:123:36 | cmd | promisification.js:124:17:124:19 | cmd | provenance | | +| promisification.js:130:11:130:14 | code | promisification.js:133:21:133:24 | code | provenance | | +| promisification.js:130:11:130:14 | code | promisification.js:136:15:136:18 | code | provenance | | +| promisification.js:130:18:130:25 | req.body | promisification.js:130:11:130:14 | code | provenance | | +| promisification.js:141:11:141:14 | code | promisification.js:144:21:144:24 | code | provenance | | +| promisification.js:141:11:141:14 | code | promisification.js:147:15:147:18 | code | provenance | | +| promisification.js:141:11:141:14 | code | promisification.js:150:24:150:27 | code | provenance | | +| promisification.js:141:11:141:14 | code | promisification.js:151:28:151:31 | code | provenance | | +| promisification.js:141:11:141:14 | code | promisification.js:152:25:152:28 | code | provenance | | +| promisification.js:141:18:141:25 | req.body | promisification.js:141:11:141:14 | code | provenance | | | third-party-command-injection.js:5:20:5:26 | command | third-party-command-injection.js:6:21:6:27 | command | provenance | | nodes | actions.js:8:9:8:13 | title | semmle.label | title | @@ -446,6 +526,71 @@ nodes | other.js:28:27:28:29 | cmd | semmle.label | cmd | | other.js:30:33:30:35 | cmd | semmle.label | cmd | | other.js:34:44:34:46 | cmd | semmle.label | cmd | +| promisification.js:8:21:8:24 | code | semmle.label | code | +| promisification.js:9:13:9:16 | code | semmle.label | code | +| promisification.js:9:13:9:21 | code.code | semmle.label | code.code | +| promisification.js:15:11:15:14 | code | semmle.label | code | +| promisification.js:15:18:15:25 | req.body | semmle.label | req.body | +| promisification.js:16:15:16:18 | code | semmle.label | code | +| promisification.js:21:11:21:14 | code | semmle.label | code | +| promisification.js:21:18:21:25 | req.body | semmle.label | req.body | +| promisification.js:24:22:24:25 | code | semmle.label | code | +| promisification.js:30:11:30:14 | code | semmle.label | code | +| promisification.js:30:18:30:25 | req.body | semmle.label | req.body | +| promisification.js:31:24:31:27 | code | semmle.label | code | +| promisification.js:37:11:37:14 | code | semmle.label | code | +| promisification.js:37:18:37:25 | req.body | semmle.label | req.body | +| promisification.js:40:21:40:24 | code | semmle.label | code | +| promisification.js:43:24:43:27 | code | semmle.label | code | +| promisification.js:49:11:49:14 | code | semmle.label | code | +| promisification.js:49:18:49:25 | req.body | semmle.label | req.body | +| promisification.js:52:21:52:24 | code | semmle.label | code | +| promisification.js:55:15:55:18 | code | semmle.label | code | +| promisification.js:61:9:61:11 | cmd | semmle.label | cmd | +| promisification.js:61:15:61:22 | req.body | semmle.label | req.body | +| promisification.js:65:21:65:23 | cmd | semmle.label | cmd | +| promisification.js:69:20:69:22 | cmd | semmle.label | cmd | +| promisification.js:74:26:74:28 | cmd | semmle.label | cmd | +| promisification.js:77:24:77:26 | cmd | semmle.label | cmd | +| promisification.js:78:28:78:30 | cmd | semmle.label | cmd | +| promisification.js:79:25:79:27 | cmd | semmle.label | cmd | +| promisification.js:81:34:81:37 | code | semmle.label | code | +| promisification.js:83:36:83:39 | code | semmle.label | code | +| promisification.js:89:12:89:14 | cmd | semmle.label | cmd | +| promisification.js:99:11:99:14 | code | semmle.label | code | +| promisification.js:99:18:99:25 | req.body | semmle.label | req.body | +| promisification.js:100:23:100:26 | code | semmle.label | code | +| promisification.js:101:27:101:30 | code | semmle.label | code | +| promisification.js:102:27:102:30 | code | semmle.label | code | +| promisification.js:106:24:106:27 | code | semmle.label | code | +| promisification.js:109:24:109:27 | code | semmle.label | code | +| promisification.js:114:11:114:14 | code | semmle.label | code | +| promisification.js:114:18:114:25 | req.body | semmle.label | req.body | +| promisification.js:116:32:116:34 | cmd | semmle.label | cmd | +| promisification.js:117:16:119:10 | new Pro ... }) [PromiseValue] | semmle.label | new Pro ... }) [PromiseValue] | +| promisification.js:117:29:117:35 | resolve [Return] [resolve-value] | semmle.label | resolve [Return] [resolve-value] | +| promisification.js:118:13:118:19 | [post update] resolve [resolve-value] | semmle.label | [post update] resolve [resolve-value] | +| promisification.js:118:21:118:23 | cmd | semmle.label | cmd | +| promisification.js:122:11:122:20 | cmdPromise [PromiseValue] | semmle.label | cmdPromise [PromiseValue] | +| promisification.js:122:24:122:46 | createE ... e(code) [PromiseValue] | semmle.label | createE ... e(code) [PromiseValue] | +| promisification.js:122:42:122:45 | code | semmle.label | code | +| promisification.js:123:5:123:27 | maybe(n ... romise) [PromiseValue] | semmle.label | maybe(n ... romise) [PromiseValue] | +| promisification.js:123:17:123:26 | cmdPromise [PromiseValue] | semmle.label | cmdPromise [PromiseValue] | +| promisification.js:123:34:123:36 | cmd | semmle.label | cmd | +| promisification.js:124:17:124:19 | cmd | semmle.label | cmd | +| promisification.js:130:11:130:14 | code | semmle.label | code | +| promisification.js:130:18:130:25 | req.body | semmle.label | req.body | +| promisification.js:133:21:133:24 | code | semmle.label | code | +| promisification.js:136:15:136:18 | code | semmle.label | code | +| promisification.js:141:11:141:14 | code | semmle.label | code | +| promisification.js:141:18:141:25 | req.body | semmle.label | req.body | +| promisification.js:144:21:144:24 | code | semmle.label | code | +| promisification.js:147:15:147:18 | code | semmle.label | code | +| promisification.js:150:24:150:27 | code | semmle.label | code | +| promisification.js:151:28:151:31 | code | semmle.label | code | +| promisification.js:152:25:152:28 | code | semmle.label | code | | third-party-command-injection.js:5:20:5:26 | command | semmle.label | command | | third-party-command-injection.js:6:21:6:27 | command | semmle.label | command | subpaths +| promisification.js:116:32:116:34 | cmd | promisification.js:118:21:118:23 | cmd | promisification.js:117:29:117:35 | resolve [Return] [resolve-value] | promisification.js:117:16:119:10 | new Pro ... }) [PromiseValue] | +| promisification.js:122:42:122:45 | code | promisification.js:116:32:116:34 | cmd | promisification.js:117:16:119:10 | new Pro ... }) [PromiseValue] | promisification.js:122:24:122:46 | createE ... e(code) [PromiseValue] | diff --git a/javascript/ql/test/query-tests/Security/CWE-078/CommandInjection/promisification.js b/javascript/ql/test/query-tests/Security/CWE-078/CommandInjection/promisification.js new file mode 100644 index 000000000000..b062c8b7ee2b --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-078/CommandInjection/promisification.js @@ -0,0 +1,153 @@ +const express = require('express'); +const bodyParser = require('body-parser'); +const cp = require('child_process'); + +const app = express(); +app.use(bodyParser.json()); + +function legacyEval(code) { + cp.exec(code.code); // $ Alert +} + +app.post('/eval', async (req, res) => { + const { promisify } = require('util'); + const evalAsync = promisify(legacyEval); + const code = req.body; // $ Source + evalAsync(code); +}); + +app.post('/eval', async (req, res) => { + const directPromisify = require('util.promisify'); + const code = req.body; // $ Source + + const promisifiedExec3 = directPromisify(cp.exec); + promisifiedExec3(code); // $ Alert +}); + +app.post('/eval', async (req, res) => { + const promisify2 = require('util.promisify-all'); + const promisifiedCp = promisify2(cp); + const code = req.body; // $ Source + promisifiedCp.exec(code); // $ Alert +}); + + +app.post('/eval', async (req, res) => { + var garPromisify = require("@gar/promisify"); + const code = req.body; // $ Source + + const promisifiedExec = garPromisify(cp.exec); + promisifiedExec(code); // $ Alert + + const promisifiedCp = garPromisify(cp); + promisifiedCp.exec(code); // $ Alert +}); + +app.post('/eval', async (req, res) => { + require('util.promisify/shim')(); + const util = require('util'); + const code = req.body; // $ Source + + const promisifiedExec = util.promisify(cp.exec); + promisifiedExec(code); // $ Alert + + const execAsync = util.promisify(cp.exec.bind(cp)); + execAsync(code); // $ Alert +}); + + +app.post('/eval', async (req, res) => { + const es6Promisify = require("es6-promisify"); + let cmd = req.body; // $ Source + + // Test basic promisification + const promisifiedExec = es6Promisify(cp.exec); + promisifiedExec(cmd); // $ Alert + + // Test with method binding + const execBoundAsync = es6Promisify(cp.exec.bind(cp)); + execBoundAsync(cmd); // $ Alert + + const promisifiedExecMulti = es6Promisify(cp.exec, { + multiArgs: true + }); + promisifiedExecMulti(cmd); // $ Alert + + const promisifiedCp = es6Promisify.promisifyAll(cp); + promisifiedCp.exec(cmd); // $ Alert + promisifiedCp.execFile(cmd); // $ Alert + promisifiedCp.spawn(cmd); // $ Alert + + const lambda = es6Promisify((code, callback) => { + try { + const result = cp.exec(code); // $ Alert + callback(null, result); + } catch (err) { + callback(err); + } + }); + lambda(cmd); +}); + + +app.post('/eval', async (req, res) => { + var thenifyAll = require('thenify-all'); + var cpThenifyAll = thenifyAll(require('child_process'), {}, [ + 'exec', + 'execSync', + ]); + const code = req.body; // $ Source + cpThenifyAll.exec(code); // $ Alert + cpThenifyAll.execSync(code); // $ Alert + cpThenifyAll.execFile(code); // $ SPURIOUS: Alert - not promisified, as it is not listed in `thenifyAll`, but it should fine to flag it + + + var cpThenifyAll1 = thenifyAll.withCallback(require('child_process'), {}, ['exec']); + cpThenifyAll1.exec(code, function (err, string) {}); // $ Alert + + var cpThenifyAll2 = thenifyAll(require('child_process')); + cpThenifyAll2.exec(code); // $ Alert +}); + +app.post('/eval', async (req, res) => { + const maybe = require('call-me-maybe'); + const code = req.body; // $ Source + + function createExecPromise(cmd) { + return new Promise((resolve) => { + resolve(cmd); + }); + } + + const cmdPromise = createExecPromise(code); + maybe(null, cmdPromise).then(cmd => { + cp.exec(cmd); // $ Alert + }); +}); + +app.post('/eval', async (req, res) => { + const utilPromisify = require('util-promisify'); + const code = req.body; // $ Source + + const promisifiedExec = utilPromisify(cp.exec); + promisifiedExec(code); // $ Alert + + const execAsync = utilPromisify(cp.exec.bind(cp)); + execAsync(code); // $ Alert +}); + +app.post('/eval', async (req, res) => { + const {promisify, promisifyAll} = require('@google-cloud/promisify'); + const code = req.body; // $ Source + + const promisifiedExec = promisify(cp.exec); + promisifiedExec(code); // $ Alert + + const execAsync = promisify(cp.exec.bind(cp)); + execAsync(code); // $ Alert + + const promisifiedCp = promisifyAll(cp); + promisifiedCp.exec(code); // $ Alert + promisifiedCp.execFile(code); // $ Alert + promisifiedCp.spawn(code); // $ Alert +}); diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.expected b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected similarity index 66% rename from javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.expected rename to javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected index 036c2e563cfa..8096bea00f9a 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.expected @@ -3,6 +3,7 @@ | tst.js:13:15:13:18 | prop | tst.js:8:28:8:51 | req.que ... trolled | tst.js:13:15:13:18 | prop | A property name to write to depends on a $@. | tst.js:8:28:8:51 | req.que ... trolled | user-provided value | | tst.js:14:31:14:34 | prop | tst.js:8:28:8:51 | req.que ... trolled | tst.js:14:31:14:34 | prop | A property name to write to depends on a $@. | tst.js:8:28:8:51 | req.que ... trolled | user-provided value | | tst.js:16:10:16:13 | prop | tst.js:8:28:8:51 | req.que ... trolled | tst.js:16:10:16:13 | prop | A property name to write to depends on a $@. | tst.js:8:28:8:51 | req.que ... trolled | user-provided value | +| tst.js:22:10:22:12 | key | tst.js:20:14:20:21 | req.body | tst.js:22:10:22:12 | key | A property name to write to depends on a $@. | tst.js:20:14:20:21 | req.body | user-provided value | | tstNonExpr.js:8:17:8:23 | userVal | tstNonExpr.js:5:17:5:23 | req.url | tstNonExpr.js:8:17:8:23 | userVal | A header name depends on a $@. | tstNonExpr.js:5:17:5:23 | req.url | user-provided value | edges | tst.js:8:6:8:9 | prop | tst.js:9:8:9:11 | prop | provenance | | @@ -11,11 +12,13 @@ edges | tst.js:8:6:8:9 | prop | tst.js:16:10:16:13 | prop | provenance | | | tst.js:8:13:8:52 | myCoolL ... rolled) | tst.js:8:6:8:9 | prop | provenance | | | tst.js:8:28:8:51 | req.que ... trolled | tst.js:8:13:8:52 | myCoolL ... rolled) | provenance | | -| tst.js:8:28:8:51 | req.que ... trolled | tst.js:21:25:21:25 | x | provenance | | -| tst.js:21:25:21:25 | x | tst.js:22:15:22:15 | x | provenance | | -| tst.js:22:6:22:11 | result | tst.js:23:9:23:14 | result | provenance | | -| tst.js:22:15:22:15 | x | tst.js:22:6:22:11 | result | provenance | | -| tst.js:23:9:23:14 | result | tst.js:23:9:23:42 | result. ... length) | provenance | | +| tst.js:8:28:8:51 | req.que ... trolled | tst.js:27:25:27:25 | x | provenance | | +| tst.js:20:14:20:21 | req.body | tst.js:21:3:21:5 | key | provenance | Config | +| tst.js:21:3:21:5 | key | tst.js:22:10:22:12 | key | provenance | | +| tst.js:27:25:27:25 | x | tst.js:28:15:28:15 | x | provenance | | +| tst.js:28:6:28:11 | result | tst.js:29:9:29:14 | result | provenance | | +| tst.js:28:15:28:15 | x | tst.js:28:6:28:11 | result | provenance | | +| tst.js:29:9:29:14 | result | tst.js:29:9:29:42 | result. ... length) | provenance | | | tstNonExpr.js:5:7:5:13 | userVal | tstNonExpr.js:8:17:8:23 | userVal | provenance | | | tstNonExpr.js:5:17:5:23 | req.url | tstNonExpr.js:5:7:5:13 | userVal | provenance | | nodes @@ -26,13 +29,16 @@ nodes | tst.js:13:15:13:18 | prop | semmle.label | prop | | tst.js:14:31:14:34 | prop | semmle.label | prop | | tst.js:16:10:16:13 | prop | semmle.label | prop | -| tst.js:21:25:21:25 | x | semmle.label | x | -| tst.js:22:6:22:11 | result | semmle.label | result | -| tst.js:22:15:22:15 | x | semmle.label | x | -| tst.js:23:9:23:14 | result | semmle.label | result | -| tst.js:23:9:23:42 | result. ... length) | semmle.label | result. ... length) | +| tst.js:20:14:20:21 | req.body | semmle.label | req.body | +| tst.js:21:3:21:5 | key | semmle.label | key | +| tst.js:22:10:22:12 | key | semmle.label | key | +| tst.js:27:25:27:25 | x | semmle.label | x | +| tst.js:28:6:28:11 | result | semmle.label | result | +| tst.js:28:15:28:15 | x | semmle.label | x | +| tst.js:29:9:29:14 | result | semmle.label | result | +| tst.js:29:9:29:42 | result. ... length) | semmle.label | result. ... length) | | tstNonExpr.js:5:7:5:13 | userVal | semmle.label | userVal | | tstNonExpr.js:5:17:5:23 | req.url | semmle.label | req.url | | tstNonExpr.js:8:17:8:23 | userVal | semmle.label | userVal | subpaths -| tst.js:8:28:8:51 | req.que ... trolled | tst.js:21:25:21:25 | x | tst.js:23:9:23:42 | result. ... length) | tst.js:8:13:8:52 | myCoolL ... rolled) | +| tst.js:8:28:8:51 | req.que ... trolled | tst.js:27:25:27:25 | x | tst.js:29:9:29:42 | result. ... length) | tst.js:8:13:8:52 | myCoolL ... rolled) | diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.qlref b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.qlref similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/RemotePropertyInjection.qlref rename to javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/RemotePropertyInjection.qlref diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tst.js b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js similarity index 87% rename from javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tst.js rename to javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js index 301b7b808810..ebdb07a758b1 100644 --- a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tst.js +++ b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tst.js @@ -16,10 +16,15 @@ app.get('/user/:id', function(req, res) { headers[prop] = 42; // $ Alert res.set(headers); myCoolLocalFct[req.query.x](); // OK - flagged by method name injection + + Object.keys(req.body).forEach( // $ Source + key => { + myObj[key] = 42; // $ Alert + } + ); }); function myCoolLocalFct(x) { var result = x; return result.substring(0, result.length); - -} \ No newline at end of file +} diff --git a/javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tstNonExpr.js b/javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tstNonExpr.js similarity index 100% rename from javascript/ql/test/query-tests/Security/CWE-400/RemovePropertyInjection/tstNonExpr.js rename to javascript/ql/test/query-tests/Security/CWE-400/RemotePropertyInjection/tstNonExpr.js diff --git a/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.expected b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.expected similarity index 56% rename from javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.expected rename to javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.expected index ddebfa1d1c8a..2e59a7a8bd1d 100644 --- a/javascript/ql/test/experimental/Security/CWE-942/CorsPermissiveConfiguration.expected +++ b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.expected @@ -1,3 +1,12 @@ +#select +| apollo-test.js:11:25:11:28 | true | apollo-test.js:11:25:11:28 | true | apollo-test.js:11:25:11:28 | true | CORS Origin allows broad access due to $@. | apollo-test.js:11:25:11:28 | true | permissive or user controlled value | +| apollo-test.js:21:25:21:28 | null | apollo-test.js:21:25:21:28 | null | apollo-test.js:21:25:21:28 | null | CORS Origin allows broad access due to $@. | apollo-test.js:21:25:21:28 | null | permissive or user controlled value | +| apollo-test.js:26:25:26:35 | user_origin | apollo-test.js:8:33:8:39 | req.url | apollo-test.js:26:25:26:35 | user_origin | CORS Origin allows broad access due to $@. | apollo-test.js:8:33:8:39 | req.url | permissive or user controlled value | +| apollo-test.js:26:25:26:35 | user_origin | apollo-test.js:8:42:8:45 | true | apollo-test.js:26:25:26:35 | user_origin | CORS Origin allows broad access due to $@. | apollo-test.js:8:42:8:45 | true | permissive or user controlled value | +| express-test.js:26:17:26:19 | '*' | express-test.js:26:17:26:19 | '*' | express-test.js:26:17:26:19 | '*' | CORS Origin allows broad access due to $@. | express-test.js:26:17:26:19 | '*' | permissive or user controlled value | +| express-test.js:33:17:33:27 | user_origin | express-test.js:10:33:10:39 | req.url | express-test.js:33:17:33:27 | user_origin | CORS Origin allows broad access due to $@. | express-test.js:10:33:10:39 | req.url | permissive or user controlled value | +| express-test.js:33:17:33:27 | user_origin | express-test.js:10:42:10:45 | true | express-test.js:33:17:33:27 | user_origin | CORS Origin allows broad access due to $@. | express-test.js:10:42:10:45 | true | permissive or user controlled value | +| express-test.js:48:17:48:19 | '*' | express-test.js:48:17:48:19 | '*' | express-test.js:48:17:48:19 | '*' | CORS Origin allows broad access due to $@. | express-test.js:48:17:48:19 | '*' | permissive or user controlled value | edges | apollo-test.js:8:9:8:19 | user_origin | apollo-test.js:26:25:26:35 | user_origin | provenance | | | apollo-test.js:8:9:8:19 | user_origin | apollo-test.js:26:25:26:35 | user_origin | provenance | | @@ -6,8 +15,11 @@ edges | apollo-test.js:8:33:8:39 | req.url | apollo-test.js:8:23:8:46 | url.par ... , true) | provenance | | | apollo-test.js:8:42:8:45 | true | apollo-test.js:8:23:8:46 | url.par ... , true) | provenance | | | express-test.js:10:9:10:19 | user_origin | express-test.js:33:17:33:27 | user_origin | provenance | | +| express-test.js:10:9:10:19 | user_origin | express-test.js:33:17:33:27 | user_origin | provenance | | +| express-test.js:10:23:10:46 | url.par ... , true) | express-test.js:10:9:10:19 | user_origin | provenance | | | express-test.js:10:23:10:46 | url.par ... , true) | express-test.js:10:9:10:19 | user_origin | provenance | | | express-test.js:10:33:10:39 | req.url | express-test.js:10:23:10:46 | url.par ... , true) | provenance | | +| express-test.js:10:42:10:45 | true | express-test.js:10:23:10:46 | url.par ... , true) | provenance | | nodes | apollo-test.js:8:9:8:19 | user_origin | semmle.label | user_origin | | apollo-test.js:8:9:8:19 | user_origin | semmle.label | user_origin | @@ -20,15 +32,13 @@ nodes | apollo-test.js:26:25:26:35 | user_origin | semmle.label | user_origin | | apollo-test.js:26:25:26:35 | user_origin | semmle.label | user_origin | | express-test.js:10:9:10:19 | user_origin | semmle.label | user_origin | +| express-test.js:10:9:10:19 | user_origin | semmle.label | user_origin | +| express-test.js:10:23:10:46 | url.par ... , true) | semmle.label | url.par ... , true) | | express-test.js:10:23:10:46 | url.par ... , true) | semmle.label | url.par ... , true) | | express-test.js:10:33:10:39 | req.url | semmle.label | req.url | +| express-test.js:10:42:10:45 | true | semmle.label | true | | express-test.js:26:17:26:19 | '*' | semmle.label | '*' | | express-test.js:33:17:33:27 | user_origin | semmle.label | user_origin | +| express-test.js:33:17:33:27 | user_origin | semmle.label | user_origin | +| express-test.js:48:17:48:19 | '*' | semmle.label | '*' | subpaths -#select -| apollo-test.js:11:25:11:28 | true | apollo-test.js:11:25:11:28 | true | apollo-test.js:11:25:11:28 | true | CORS Origin misconfiguration due to a $@. | apollo-test.js:11:25:11:28 | true | too permissive or user controlled value | -| apollo-test.js:21:25:21:28 | null | apollo-test.js:21:25:21:28 | null | apollo-test.js:21:25:21:28 | null | CORS Origin misconfiguration due to a $@. | apollo-test.js:21:25:21:28 | null | too permissive or user controlled value | -| apollo-test.js:26:25:26:35 | user_origin | apollo-test.js:8:33:8:39 | req.url | apollo-test.js:26:25:26:35 | user_origin | CORS Origin misconfiguration due to a $@. | apollo-test.js:8:33:8:39 | req.url | too permissive or user controlled value | -| apollo-test.js:26:25:26:35 | user_origin | apollo-test.js:8:42:8:45 | true | apollo-test.js:26:25:26:35 | user_origin | CORS Origin misconfiguration due to a $@. | apollo-test.js:8:42:8:45 | true | too permissive or user controlled value | -| express-test.js:26:17:26:19 | '*' | express-test.js:26:17:26:19 | '*' | express-test.js:26:17:26:19 | '*' | CORS Origin misconfiguration due to a $@. | express-test.js:26:17:26:19 | '*' | too permissive or user controlled value | -| express-test.js:33:17:33:27 | user_origin | express-test.js:10:33:10:39 | req.url | express-test.js:33:17:33:27 | user_origin | CORS Origin misconfiguration due to a $@. | express-test.js:10:33:10:39 | req.url | too permissive or user controlled value | diff --git a/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref new file mode 100644 index 000000000000..b38b30eb842d --- /dev/null +++ b/javascript/ql/test/query-tests/Security/CWE-942/CorsPermissiveConfiguration.qlref @@ -0,0 +1,2 @@ +query: Security/CWE-942/CorsPermissiveConfiguration.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/javascript/ql/test/experimental/Security/CWE-942/apollo-test.js b/javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js similarity index 72% rename from javascript/ql/test/experimental/Security/CWE-942/apollo-test.js rename to javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js index f55d5dc2c3ec..22019a722584 100644 --- a/javascript/ql/test/experimental/Security/CWE-942/apollo-test.js +++ b/javascript/ql/test/query-tests/Security/CWE-942/apollo-test.js @@ -5,10 +5,10 @@ var https = require('https'), var server = https.createServer(function () { }); server.on('request', function (req, res) { - let user_origin = url.parse(req.url, true).query.origin; + let user_origin = url.parse(req.url, true).query.origin; // $ Source // BAD: CORS too permissive const server_1 = new ApolloServer({ - cors: { origin: true } + cors: { origin: true } // $ Alert }); // GOOD: restrictive CORS @@ -18,11 +18,11 @@ server.on('request', function (req, res) { // BAD: CORS too permissive const server_3 = new ApolloServer({ - cors: { origin: null } + cors: { origin: null } // $ Alert }); // BAD: CORS is controlled by user const server_4 = new ApolloServer({ - cors: { origin: user_origin } + cors: { origin: user_origin } // $ Alert }); }); \ No newline at end of file diff --git a/javascript/ql/test/experimental/Security/CWE-942/express-test.js b/javascript/ql/test/query-tests/Security/CWE-942/express-test.js similarity index 56% rename from javascript/ql/test/experimental/Security/CWE-942/express-test.js rename to javascript/ql/test/query-tests/Security/CWE-942/express-test.js index 3ad31a6a31a8..31454e0a4ebf 100644 --- a/javascript/ql/test/experimental/Security/CWE-942/express-test.js +++ b/javascript/ql/test/query-tests/Security/CWE-942/express-test.js @@ -7,7 +7,7 @@ var https = require('https'), var server = https.createServer(function () { }); server.on('request', function (req, res) { - let user_origin = url.parse(req.url, true).query.origin; + let user_origin = url.parse(req.url, true).query.origin; // $ Source // BAD: CORS too permissive, default value is * var app1 = express(); @@ -23,14 +23,30 @@ server.on('request', function (req, res) { // BAD: CORS too permissive var app3 = express(); var corsOption3 = { - origin: '*' + origin: '*' // $ Alert }; app3.use(cors(corsOption3)); // BAD: CORS is controlled by user var app4 = express(); var corsOption4 = { - origin: user_origin + origin: user_origin // $ Alert }; app4.use(cors(corsOption4)); + + // GOOD: CORS allows any origin but credentials are disabled (safe pattern) + var app5 = express(); + var corsOption5 = { + origin: '*', + credentials: false + }; + app5.use(cors(corsOption5)); + + // BAD: CORS allows any origin with credentials enabled + var app6 = express(); + var corsOption6 = { + origin: '*', // $ Alert + credentials: true + }; + app6.use(cors(corsOption6)); }); \ No newline at end of file diff --git a/misc/bazel/csharp.bzl b/misc/bazel/csharp.bzl index 2ba8c59f0767..7a3179096276 100644 --- a/misc/bazel/csharp.bzl +++ b/misc/bazel/csharp.bzl @@ -47,6 +47,30 @@ def codeql_xunit_test(name, **kwargs): **kwargs ) +def _filter_published_files_impl(ctx): + dir = ctx.attr.src[DefaultInfo].files_to_run.executable.dirname + files = ctx.attr.src[DefaultInfo].files.to_list() + + # filter out all unneeded localization directories, that contain + # duplicate files that would break our packaging + files = [ + f + for f in files + if f.dirname in (dir, dir + "/bin", dir + "\\bin") + ] + return [ + DefaultInfo( + files = depset(files), + ), + ] + +_filter_published_files = rule( + implementation = _filter_published_files_impl, + attrs = { + "src": attr.label(), + }, +) + def codeql_csharp_binary(name, **kwargs): kwargs.setdefault("nullable", "enable") kwargs.setdefault("target_frameworks", [TARGET_FRAMEWORK]) @@ -63,6 +87,7 @@ def codeql_csharp_binary(name, **kwargs): csharp_binary_target = "bin/" + name publish_binary_target = "publish/" + name + filtered_target = "filtered/" + name csharp_binary(name = csharp_binary_target, srcs = srcs, resources = resources, visibility = visibility, **kwargs) publish_binary( name = publish_binary_target, @@ -76,10 +101,14 @@ def codeql_csharp_binary(name, **kwargs): }, ), ) + _filter_published_files( + name = filtered_target, + src = publish_binary_target, + ) codeql_pkg_files( name = name, - exes = [publish_binary_target], + exes = [filtered_target], prefix = "tools/{CODEQL_PLATFORM}", strip_prefix = strip_prefix.files_only(), visibility = visibility, diff --git a/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/MODULE.bazel b/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/MODULE.bazel new file mode 100644 index 000000000000..ba047f282b08 --- /dev/null +++ b/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/MODULE.bazel @@ -0,0 +1,57 @@ +"rules_dotnet" + +module( + name = "rules_dotnet", + version = "0.19.2-codeql.1", + bazel_compatibility = [">=7.0.0"], + compatibility_level = 0, +) + +dotnet = use_extension("@rules_dotnet//dotnet:extensions.bzl", "dotnet") +dotnet.toolchain(dotnet_version = "9.0.300") +use_repo(dotnet, "dotnet_toolchains") + +register_toolchains("@dotnet_toolchains//:all") + +paket2bazel_dependencies_extension = use_extension("//dotnet:paket.paket2bazel_dependencies_extension.bzl", "paket2bazel_dependencies_extension") +use_repo(paket2bazel_dependencies_extension, "paket.paket2bazel_dependencies") + +rules_dotnet_nuget_packages_extension = use_extension("//dotnet:paket.rules_dotnet_nuget_packages_extension.bzl", "rules_dotnet_nuget_packages_extension") +use_repo(rules_dotnet_nuget_packages_extension, "paket.rules_dotnet_nuget_packages") + +targeting_packs_extension = use_extension("//dotnet/private/sdk/targeting_packs:dotnet.targeting_packs_extension.bzl", "targeting_packs_extension") +use_repo(targeting_packs_extension, "dotnet.targeting_packs") + +runtime_packs_extension = use_extension("//dotnet/private/sdk/runtime_packs:dotnet.runtime_packs_extension.bzl", "runtime_packs_extension") +use_repo(runtime_packs_extension, "dotnet.runtime_packs") + +apphost_packs_extension = use_extension("//dotnet/private/sdk/apphost_packs:dotnet.apphost_packs_extension.bzl", "apphost_packs_extension") +use_repo(apphost_packs_extension, "dotnet.apphost_packs") + +bazel_dep(name = "bazel_skylib", version = "1.7.1") +bazel_dep(name = "platforms", version = "1.0.0") +bazel_dep(name = "aspect_bazel_lib", version = "2.19.4") +bazel_dep(name = "rules_shell", version = "0.5.0") + +# Dev dependencies +bazel_dep(name = "stardoc", version = "0.8.0", dev_dependency = True) +bazel_dep(name = "rules_pkg", version = "1.1.0", dev_dependency = True) +bazel_dep(name = "gazelle", version = "0.44.0", dev_dependency = True, repo_name = "bazel_gazelle") +bazel_dep(name = "bazel_skylib_gazelle_plugin", version = "1.7.1", dev_dependency = True) +bazel_dep(name = "rules_cc", version = "0.1.2", dev_dependency = True) +bazel_dep(name = "rules_testing", version = "0.8.0", dev_dependency = True) +bazel_dep(name = "bazel_ci_rules", version = "1.0.0", dev_dependency = True) +bazel_dep(name = "dotnet_test_resources_other_repo", version = "", dev_dependency = True) +local_path_override( + module_name = "dotnet_test_resources_other_repo", + path = "dotnet/private/tests/resources/other_repo", +) + +rules_dotnet_dev_nuget_packages_extension = use_extension("//dotnet:paket.rules_dotnet_dev_nuget_packages_extension.bzl", "rules_dotnet_dev_nuget_packages_extension", dev_dependency = True) +use_repo(rules_dotnet_dev_nuget_packages_extension, "paket.rules_dotnet_dev_nuget_packages") + +rules_dotnet_nuget_resource_assemblies_tests_extension = use_extension("//dotnet:paket.rules_dotnet_nuget_resource_assemblies_tests_extension.bzl", "rules_dotnet_nuget_resource_assemblies_tests_extension", dev_dependency = True) +use_repo(rules_dotnet_nuget_resource_assemblies_tests_extension, "paket.rules_dotnet_nuget_resource_assemblies_tests") + +internal_dev_deps = use_extension("//dotnet:internal_dev_deps.bzl", "internal_dev_deps", dev_dependency = True) +use_repo(internal_dev_deps, "buildkite_config") diff --git a/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/patches/revert_additional_files_in_nuget_archive.patch b/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/patches/revert_additional_files_in_nuget_archive.patch new file mode 100644 index 000000000000..f1c629694ecb --- /dev/null +++ b/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/patches/revert_additional_files_in_nuget_archive.patch @@ -0,0 +1,11 @@ +--- a/dotnet/private/rules/nuget/nuget_archive.bzl 2025-09-04 16:14:49.402400198 +0200 ++++ b/dotnet/private/rules/nuget/nuget_archive.bzl 2025-09-04 16:12:16.577010334 +0200 +@@ -123,7 +123,7 @@ + return + + # If the folder is empty we do nothing +- if file.endswith(tfm) or file.endswith(tfm + "/"): ++ if file.find("/", tfm_end + 1) != -1: + return + + group = groups[group_name] diff --git a/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/source.json b/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/source.json new file mode 100644 index 000000000000..928683521e25 --- /dev/null +++ b/misc/bazel/registry/modules/rules_dotnet/0.19.2-codeql.1/source.json @@ -0,0 +1,9 @@ +{ + "integrity": "sha256-6f9LidI9BUve7+TpoL1sh5GKC6sgLSYNImlVnVaiHEE=", + "strip_prefix": "rules_dotnet-0.19.2", + "url": "https://github.com/bazel-contrib/rules_dotnet/releases/download/v0.19.2/rules_dotnet-v0.19.2.tar.gz", + "patches": { + "revert_additional_files_in_nuget_archive.patch": "sha256-FzMKXeHVhIBXQRCNFB0EANDszgJc/BBaPgWCzkbW9Ck=" + }, + "patch_strip": 1 +} diff --git a/misc/bazel/registry/modules/rules_dotnet/metadata.json b/misc/bazel/registry/modules/rules_dotnet/metadata.json new file mode 100644 index 000000000000..684babcda14b --- /dev/null +++ b/misc/bazel/registry/modules/rules_dotnet/metadata.json @@ -0,0 +1,19 @@ +{ + "homepage": "https://github.com/bazel-contrib/rules_dotnet", + "maintainers": [ + { + "name": "Dan\u00edel Poul Purkh\u00fas", + "email": "purkhusid@gmail.com", + "github": "purkhusid", + "github_user_id": 5622403 + } + ], + "repository": [ + "github:bazelbuild/rules_dotnet", + "github:bazel-contrib/rules_dotnet" + ], + "versions": [ + "0.19.2-codeql.1" + ], + "yanked_versions": {} +} diff --git a/misc/scripts/shared-code-metrics.py b/misc/scripts/shared-code-metrics.py index 94679693186a..62a14be6749b 100755 --- a/misc/scripts/shared-code-metrics.py +++ b/misc/scripts/shared-code-metrics.py @@ -159,7 +159,7 @@ def link(self): def containsDirectory(self, dir): return self.path.parent.parts == dir.parts[:len(self.path.parent.parts)] - # dir.startsWith(self.path.parent) + # dir.startsWith(self.path.parent) # Constructs a list of transitive depedencies of this package. def calculateDependencies(self, packageNameMap): diff --git a/misc/suite-helpers/CHANGELOG.md b/misc/suite-helpers/CHANGELOG.md index 4a5e75cac92a..6b54042fef32 100644 --- a/misc/suite-helpers/CHANGELOG.md +++ b/misc/suite-helpers/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/misc/suite-helpers/change-notes/released/1.0.31.md b/misc/suite-helpers/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/misc/suite-helpers/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/misc/suite-helpers/codeql-pack.release.yml b/misc/suite-helpers/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/misc/suite-helpers/codeql-pack.release.yml +++ b/misc/suite-helpers/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index 78bba0ca5881..a0249432210d 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.30 +version: 1.0.31 groups: shared warnOnImplicitThis: true diff --git a/powershell/ql/lib/semmle/code/powershell/controlflow/BasicBlocks.qll b/powershell/ql/lib/semmle/code/powershell/controlflow/BasicBlocks.qll index 028cecccd475..6a880013400a 100644 --- a/powershell/ql/lib/semmle/code/powershell/controlflow/BasicBlocks.qll +++ b/powershell/ql/lib/semmle/code/powershell/controlflow/BasicBlocks.qll @@ -3,7 +3,6 @@ private import powershell private import ControlFlowGraph private import CfgNodes -private import SuccessorTypes private import internal.ControlFlowGraphImpl as CfgImpl private import CfgImpl::BasicBlocks as BasicBlocksImpl private import codeql.controlflow.BasicBlock as BB @@ -163,13 +162,9 @@ private class BasicBlockAlias = BasicBlock; private class EntryBasicBlockAlias = EntryBasicBlock; -private class SuccessorTypeAlias = SuccessorType; - module Cfg implements BB::CfgSig { class ControlFlowNode = CfgNode; - class SuccessorType = SuccessorTypeAlias; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock = EntryBasicBlockAlias; diff --git a/powershell/ql/lib/semmle/code/powershell/controlflow/ControlFlowGraph.qll b/powershell/ql/lib/semmle/code/powershell/controlflow/ControlFlowGraph.qll index cb35a2379402..5fd4b130c910 100644 --- a/powershell/ql/lib/semmle/code/powershell/controlflow/ControlFlowGraph.qll +++ b/powershell/ql/lib/semmle/code/powershell/controlflow/ControlFlowGraph.qll @@ -1,8 +1,8 @@ /** Provides classes representing the control flow graph. */ +import codeql.controlflow.SuccessorType private import powershell private import BasicBlocks -private import SuccessorTypes private import internal.ControlFlowGraphImpl as CfgImpl private import internal.Splitting as Splitting private import internal.Completion @@ -57,73 +57,6 @@ class CfgNode extends CfgImpl::Node { BasicBlock getBasicBlock() { result.getANode() = this } } -/** The type of a control flow successor. */ -class SuccessorType extends CfgImpl::TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { none() } -} - -/** Provides different types of control flow successor types. */ -module SuccessorTypes { - /** A normal control flow successor. */ - class NormalSuccessor extends SuccessorType, CfgImpl::TSuccessorSuccessor { - final override string toString() { result = "successor" } - } - - /** - * A conditional control flow successor. Either a Boolean successor (`BooleanSuccessor`) - * or a matching successor (`MatchingSuccessor`) - */ - abstract class ConditionalSuccessor extends SuccessorType { - boolean value; - - bindingset[value] - ConditionalSuccessor() { any() } - - /** Gets the Boolean value of this successor. */ - final boolean getValue() { result = value } - - override string toString() { result = this.getValue().toString() } - } - - class BooleanSuccessor extends ConditionalSuccessor, CfgImpl::TBooleanSuccessor { - BooleanSuccessor() { this = CfgImpl::TBooleanSuccessor(value) } - } - - class MatchingSuccessor extends ConditionalSuccessor, CfgImpl::TMatchingSuccessor { - MatchingSuccessor() { this = CfgImpl::TMatchingSuccessor(value) } - } - - class ReturnSuccessor extends SuccessorType, CfgImpl::TReturnSuccessor { - final override string toString() { result = "return" } - } - - class BreakSuccessor extends SuccessorType, CfgImpl::TBreakSuccessor { - final override string toString() { result = "break" } - } - - class ContinueSuccessor extends SuccessorType, CfgImpl::TContinueSuccessor { - final override string toString() { result = "continue" } - } - - class ThrowSuccessor extends SuccessorType, CfgImpl::TThrowSuccessor { - final override string toString() { result = "throw" } - } - - class ExitSuccessor extends SuccessorType, CfgImpl::TExitSuccessor { - final override string toString() { result = "exit" } - } - - class EmptinessSuccessor extends ConditionalSuccessor, CfgImpl::TEmptinessSuccessor { - EmptinessSuccessor() { this = CfgImpl::TEmptinessSuccessor(value) } - - /** Holds if this is an empty successor. */ - predicate isEmpty() { value = true } - - override string toString() { if this.isEmpty() then result = "empty" else result = "non-empty" } - } -} - class Split = Splitting::Split; /** Provides different kinds of control flow graph splittings. */ diff --git a/powershell/ql/lib/semmle/code/powershell/controlflow/internal/Completion.qll b/powershell/ql/lib/semmle/code/powershell/controlflow/internal/Completion.qll index 39444b4afb5c..d1c911288c53 100644 --- a/powershell/ql/lib/semmle/code/powershell/controlflow/internal/Completion.qll +++ b/powershell/ql/lib/semmle/code/powershell/controlflow/internal/Completion.qll @@ -7,7 +7,6 @@ private import powershell private import semmle.code.powershell.controlflow.ControlFlowGraph private import ControlFlowGraphImpl as CfgImpl -private import SuccessorTypes private import codeql.util.Boolean // TODO: We most likely need a TrapCompletion as well @@ -202,7 +201,7 @@ abstract class NormalCompletion extends Completion { } /** A simple (normal) completion. */ class SimpleCompletion extends NormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } override string toString() { result = "simple" } } @@ -293,7 +292,7 @@ class ContinueCompletion extends Completion, TContinueCompletion { * expression resulting in a thrown exception. */ class ThrowCompletion extends Completion, TThrowCompletion { - override ThrowSuccessor getAMatchingSuccessorType() { any() } + override ExceptionSuccessor getAMatchingSuccessorType() { any() } override string toString() { result = "throw" } } diff --git a/powershell/ql/lib/semmle/code/powershell/controlflow/internal/ControlFlowGraphImpl.qll b/powershell/ql/lib/semmle/code/powershell/controlflow/internal/ControlFlowGraphImpl.qll index c66fb7a78ac1..eaa8dbd5ca41 100644 --- a/powershell/ql/lib/semmle/code/powershell/controlflow/internal/ControlFlowGraphImpl.qll +++ b/powershell/ql/lib/semmle/code/powershell/controlflow/internal/ControlFlowGraphImpl.qll @@ -36,23 +36,10 @@ private module CfgInput implements CfgShared::InputSig { scope.(Impl::CfgScope).exit(last, c) } - class SuccessorType = Cfg::SuccessorType; + private class SuccessorType = Cfg::SuccessorType; SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate successorTypeIsSimple(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::NormalSuccessor - } - - predicate successorTypeIsCondition(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::ConditionalSuccessor - } - - predicate isAbnormalExitType(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::ThrowSuccessor or - t instanceof Cfg::SuccessorTypes::ExitSuccessor - } - private predicate id(Raw::Ast node1, Raw::Ast node2) { node1 = node2 } private predicate idOf(Raw::Ast node, int id) = equivalenceRelation(id/2)(node, id) @@ -927,20 +914,3 @@ CfgScope getCfgScope(Ast n) { pragma[only_bind_into](result) = getCfgScopeImpl(n0) ) } - -cached -private module Cached { - cached - newtype TSuccessorType = - TSuccessorSuccessor() or - TBooleanSuccessor(Boolean b) or - TReturnSuccessor() or - TBreakSuccessor() or - TContinueSuccessor() or - TThrowSuccessor() or - TExitSuccessor() or - TMatchingSuccessor(Boolean b) or - TEmptinessSuccessor(Boolean b) -} - -import Cached diff --git a/powershell/ql/lib/semmle/code/powershell/controlflow/internal/Splitting.qll b/powershell/ql/lib/semmle/code/powershell/controlflow/internal/Splitting.qll index b2734c98194d..abb2f00a2c44 100644 --- a/powershell/ql/lib/semmle/code/powershell/controlflow/internal/Splitting.qll +++ b/powershell/ql/lib/semmle/code/powershell/controlflow/internal/Splitting.qll @@ -6,7 +6,6 @@ private import powershell private import Completion as Comp private import Comp private import ControlFlowGraphImpl -private import Cfg::SuccessorTypes private import semmle.code.powershell.controlflow.ControlFlowGraph as Cfg cached diff --git a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/SsaImpl.qll b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/SsaImpl.qll index 6f10c710fce6..070e11e7a991 100644 --- a/powershell/ql/lib/semmle/code/powershell/dataflow/internal/SsaImpl.qll +++ b/powershell/ql/lib/semmle/code/powershell/dataflow/internal/SsaImpl.qll @@ -344,7 +344,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu * from `bb1` to `bb2`. */ predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { - exists(Cfg::SuccessorTypes::ConditionalSuccessor s | + exists(Cfg::ConditionalSuccessor s | this.getBasicBlock() = bb1 and bb2 = bb1.getASuccessor(s) and s.getValue() = branch diff --git a/powershell/ql/src/experimental/ConvertToSecureStringAsPlainText.ql b/powershell/ql/src/experimental/ConvertToSecureStringAsPlainText.ql index c93b9849bff2..a6d9f14d4a77 100644 --- a/powershell/ql/src/experimental/ConvertToSecureStringAsPlainText.ql +++ b/powershell/ql/src/experimental/ConvertToSecureStringAsPlainText.ql @@ -10,10 +10,10 @@ * security */ - import powershell +import powershell - from CmdCall c - where - c.matchesName("ConvertTo-SecureString") and - c.hasNamedArgument("asplaintext") - select c, "Use of AsPlainText parameter in ConvertTo-SecureString call" \ No newline at end of file +from CmdCall c +where + c.matchesName("ConvertTo-SecureString") and + c.hasNamedArgument("asplaintext") +select c, "Use of AsPlainText parameter in ConvertTo-SecureString call" diff --git a/powershell/ql/src/experimental/UseOfReservedCmdletChar.ql b/powershell/ql/src/experimental/UseOfReservedCmdletChar.ql index 3b43c5b6ce88..c443a82ea3a5 100644 --- a/powershell/ql/src/experimental/UseOfReservedCmdletChar.ql +++ b/powershell/ql/src/experimental/UseOfReservedCmdletChar.ql @@ -10,21 +10,18 @@ * security */ - import powershell +import powershell class ReservedCharacter extends string { - ReservedCharacter() { - this = [ - "!", "@", "#", "$", - "&", "*", "(", ")", - "+", "=", "{", "^", - "}", "[", "]", "|", - ";", ":", "'", "\"", - "<", ">", ",", "?", - "/", "~"] - } + ReservedCharacter() { + this = + [ + "!", "@", "#", "$", "&", "*", "(", ")", "+", "=", "{", "^", "}", "[", "]", "|", ";", ":", + "'", "\"", "<", ">", ",", "?", "/", "~" + ] + } } from Function f, ReservedCharacter r -where f.getLowerCaseName().matches("%"+ r + "%") -select f, "Function name contains a reserved character: " + r \ No newline at end of file +where f.getLowerCaseName().matches("%" + r + "%") +select f, "Function name contains a reserved character: " + r diff --git a/powershell/ql/src/experimental/UsernameOrPasswordParameter.ql b/powershell/ql/src/experimental/UsernameOrPasswordParameter.ql index b82c2572fd67..c545c1a99f45 100644 --- a/powershell/ql/src/experimental/UsernameOrPasswordParameter.ql +++ b/powershell/ql/src/experimental/UsernameOrPasswordParameter.ql @@ -10,7 +10,7 @@ * security */ - import powershell +import powershell from Parameter p where p.matchesName(["username", "password"]) diff --git a/powershell/ql/test/library-tests/controlflow/graph/Cfg.expected b/powershell/ql/test/library-tests/controlflow/graph/Cfg.expected index cb4d46fc73ca..04537e575b7b 100644 --- a/powershell/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/powershell/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -161,18 +161,18 @@ | conditionals.ps1:102:5:107:5 | switch(...) {...} | conditionals.ps1:102:12:102:13 | n | | | conditionals.ps1:102:5:107:5 | {...} | conditionals.ps1:102:5:107:5 | switch(...) {...} | | | conditionals.ps1:102:12:102:13 | n | conditionals.ps1:104:9:104:10 | 0: | | -| conditionals.ps1:104:9:104:10 | 0: | conditionals.ps1:104:12:104:24 | {...} | true | -| conditionals.ps1:104:9:104:10 | 0: | conditionals.ps1:105:9:105:10 | 1: | false | +| conditionals.ps1:104:9:104:10 | 0: | conditionals.ps1:104:12:104:24 | {...} | match | +| conditionals.ps1:104:9:104:10 | 0: | conditionals.ps1:105:9:105:10 | 1: | no-match | | conditionals.ps1:104:12:104:24 | {...} | conditionals.ps1:104:14:104:21 | return ... | | | conditionals.ps1:104:14:104:21 | return ... | conditionals.ps1:104:21:104:21 | 0 | | | conditionals.ps1:104:21:104:21 | 0 | conditionals.ps1:101:26:108:1 | exit {...} (normal) | | -| conditionals.ps1:105:9:105:10 | 1: | conditionals.ps1:105:12:105:24 | {...} | true | -| conditionals.ps1:105:9:105:10 | 1: | conditionals.ps1:106:9:106:10 | 2: | false | +| conditionals.ps1:105:9:105:10 | 1: | conditionals.ps1:105:12:105:24 | {...} | match | +| conditionals.ps1:105:9:105:10 | 1: | conditionals.ps1:106:9:106:10 | 2: | no-match | | conditionals.ps1:105:12:105:24 | {...} | conditionals.ps1:105:14:105:21 | return ... | | | conditionals.ps1:105:14:105:21 | return ... | conditionals.ps1:105:21:105:21 | 1 | | | conditionals.ps1:105:21:105:21 | 1 | conditionals.ps1:101:26:108:1 | exit {...} (normal) | | -| conditionals.ps1:106:9:106:10 | 2: | conditionals.ps1:101:26:108:1 | exit {...} (normal) | false | -| conditionals.ps1:106:9:106:10 | 2: | conditionals.ps1:106:12:106:24 | {...} | true | +| conditionals.ps1:106:9:106:10 | 2: | conditionals.ps1:101:26:108:1 | exit {...} (normal) | no-match | +| conditionals.ps1:106:9:106:10 | 2: | conditionals.ps1:106:12:106:24 | {...} | match | | conditionals.ps1:106:12:106:24 | {...} | conditionals.ps1:106:14:106:21 | return ... | | | conditionals.ps1:106:14:106:21 | return ... | conditionals.ps1:106:21:106:21 | 2 | | | conditionals.ps1:106:21:106:21 | 2 | conditionals.ps1:101:26:108:1 | exit {...} (normal) | | @@ -185,23 +185,23 @@ | conditionals.ps1:111:5:120:5 | switch(...) {...} | conditionals.ps1:111:12:111:13 | n | | | conditionals.ps1:111:5:120:5 | {...} | conditionals.ps1:111:5:120:5 | switch(...) {...} | | | conditionals.ps1:111:12:111:13 | n | conditionals.ps1:113:9:113:10 | 0: | | -| conditionals.ps1:113:9:113:10 | 0: | conditionals.ps1:113:12:113:24 | {...} | true | -| conditionals.ps1:113:9:113:10 | 0: | conditionals.ps1:114:9:114:10 | 1: | false | +| conditionals.ps1:113:9:113:10 | 0: | conditionals.ps1:113:12:113:24 | {...} | match | +| conditionals.ps1:113:9:113:10 | 0: | conditionals.ps1:114:9:114:10 | 1: | no-match | | conditionals.ps1:113:12:113:24 | {...} | conditionals.ps1:113:14:113:21 | return ... | | | conditionals.ps1:113:14:113:21 | return ... | conditionals.ps1:113:21:113:21 | 0 | | | conditionals.ps1:113:21:113:21 | 0 | conditionals.ps1:110:34:121:1 | exit {...} (normal) | | -| conditionals.ps1:114:9:114:10 | 1: | conditionals.ps1:114:12:114:24 | {...} | true | -| conditionals.ps1:114:9:114:10 | 1: | conditionals.ps1:115:9:115:10 | 2: | false | +| conditionals.ps1:114:9:114:10 | 1: | conditionals.ps1:114:12:114:24 | {...} | match | +| conditionals.ps1:114:9:114:10 | 1: | conditionals.ps1:115:9:115:10 | 2: | no-match | | conditionals.ps1:114:12:114:24 | {...} | conditionals.ps1:114:14:114:21 | return ... | | | conditionals.ps1:114:14:114:21 | return ... | conditionals.ps1:114:21:114:21 | 1 | | | conditionals.ps1:114:21:114:21 | 1 | conditionals.ps1:110:34:121:1 | exit {...} (normal) | | -| conditionals.ps1:115:9:115:10 | 2: | conditionals.ps1:115:12:115:24 | {...} | true | -| conditionals.ps1:115:9:115:10 | 2: | conditionals.ps1:116:9:116:16 | default: | false | +| conditionals.ps1:115:9:115:10 | 2: | conditionals.ps1:115:12:115:24 | {...} | match | +| conditionals.ps1:115:9:115:10 | 2: | conditionals.ps1:116:9:116:16 | default: | no-match | | conditionals.ps1:115:12:115:24 | {...} | conditionals.ps1:115:14:115:21 | return ... | | | conditionals.ps1:115:14:115:21 | return ... | conditionals.ps1:115:21:115:21 | 2 | | | conditionals.ps1:115:21:115:21 | 2 | conditionals.ps1:110:34:121:1 | exit {...} (normal) | | -| conditionals.ps1:116:9:116:16 | default: | conditionals.ps1:110:34:121:1 | exit {...} (normal) | false | -| conditionals.ps1:116:9:116:16 | default: | conditionals.ps1:116:18:119:9 | {...} | true | +| conditionals.ps1:116:9:116:16 | default: | conditionals.ps1:110:34:121:1 | exit {...} (normal) | no-match | +| conditionals.ps1:116:9:116:16 | default: | conditionals.ps1:116:18:119:9 | {...} | match | | conditionals.ps1:116:18:119:9 | {...} | conditionals.ps1:117:13:117:33 | [Stmt] Call to write-output | | | conditionals.ps1:117:13:117:24 | Write-Output | conditionals.ps1:117:26:117:33 | Error! | | | conditionals.ps1:117:13:117:33 | Call to write-output | conditionals.ps1:118:13:118:20 | return ... | | diff --git a/python/extractor/tsg-python/python.tsg b/python/extractor/tsg-python/python.tsg index 7ad0f3f14244..00e231ee6d53 100644 --- a/python/extractor/tsg-python/python.tsg +++ b/python/extractor/tsg-python/python.tsg @@ -174,7 +174,7 @@ { let @unaryop.node = (ast-node @unaryop "UnaryOp") } (exec_statement) @exec -{ let @exec.node = (ast-node @exec "Exec") } +{ let @exec.node = (ast-node @exec "Exec") } (print_statement) @print { let @print.node = (ast-node @print "Print") } @@ -3040,7 +3040,7 @@ if some @is_kwarg { attr (@lambda.function -> @name.node) kwonlyargs = (named-child-index @param) } - else {  + else { attr (@lambda.function -> @name.node) args = (named-child-index @param) } @@ -3153,7 +3153,7 @@ if some @is_kwarg { attr (@funcdef.function -> @name.node) kwonlyargs = (named-child-index @param) } - else {  + else { attr (@funcdef.function -> @name.node) args = (named-child-index @param) } @@ -3284,7 +3284,7 @@ attr (@last.node) func = @exp.node edge @last.node -> @funcdef.funcexpr attr (@last.node -> @funcdef.funcexpr) positional_args = 0 - attr (@last.node) _location_end = (location-end @exp) + attr (@last.node) _location_end = (location-end @exp) } (decorated_definition @@ -3296,7 +3296,7 @@ attr (@last.node) func = @exp.node edge @last.node -> @class.class_expr attr (@last.node -> @class.class_expr) positional_args = 0 - attr (@last.node) _location_end = (location-end @exp) + attr (@last.node) _location_end = (location-end @exp) } ;;; Type parameters diff --git a/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected b/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected index 25790385f576..b0cb45325412 100644 --- a/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected +++ b/python/ql/integration-tests/query-suite/python-code-quality-extended.qls.expected @@ -1,3 +1,7 @@ +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/Comparisons/EqualsOrHash.ql ql/python/ql/src/Classes/Comparisons/EqualsOrNotEquals.ql ql/python/ql/src/Classes/Comparisons/IncompleteOrdering.ql @@ -5,12 +9,8 @@ ql/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql ql/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql ql/python/ql/src/Classes/InconsistentMRO.ql ql/python/ql/src/Classes/InitCallsSubclass/InitCallsSubclassMethod.ql -ql/python/ql/src/Classes/MissingCallToDel.ql -ql/python/ql/src/Classes/MissingCallToInit.ql ql/python/ql/src/Classes/MutatingDescriptor.ql ql/python/ql/src/Classes/SubclassShadowing/SubclassShadowing.ql -ql/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql -ql/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql ql/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql ql/python/ql/src/Exceptions/CatchingBaseException.ql diff --git a/python/ql/integration-tests/query-suite/python-code-quality.qls.expected b/python/ql/integration-tests/query-suite/python-code-quality.qls.expected index 25790385f576..b0cb45325412 100644 --- a/python/ql/integration-tests/query-suite/python-code-quality.qls.expected +++ b/python/ql/integration-tests/query-suite/python-code-quality.qls.expected @@ -1,3 +1,7 @@ +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/Comparisons/EqualsOrHash.ql ql/python/ql/src/Classes/Comparisons/EqualsOrNotEquals.ql ql/python/ql/src/Classes/Comparisons/IncompleteOrdering.ql @@ -5,12 +9,8 @@ ql/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql ql/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql ql/python/ql/src/Classes/InconsistentMRO.ql ql/python/ql/src/Classes/InitCallsSubclass/InitCallsSubclassMethod.ql -ql/python/ql/src/Classes/MissingCallToDel.ql -ql/python/ql/src/Classes/MissingCallToInit.ql ql/python/ql/src/Classes/MutatingDescriptor.ql ql/python/ql/src/Classes/SubclassShadowing/SubclassShadowing.ql -ql/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql -ql/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql ql/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql ql/python/ql/src/Exceptions/CatchingBaseException.ql diff --git a/python/ql/integration-tests/query-suite/python-security-and-quality.qls.expected b/python/ql/integration-tests/query-suite/python-security-and-quality.qls.expected index 8f581e166c38..faa4204c3c71 100644 --- a/python/ql/integration-tests/query-suite/python-security-and-quality.qls.expected +++ b/python/ql/integration-tests/query-suite/python-security-and-quality.qls.expected @@ -1,3 +1,7 @@ +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql +ql/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +ql/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/Comparisons/EqualsOrHash.ql ql/python/ql/src/Classes/Comparisons/EqualsOrNotEquals.ql ql/python/ql/src/Classes/Comparisons/IncompleteOrdering.ql @@ -5,16 +9,12 @@ ql/python/ql/src/Classes/ConflictingAttributesInBaseClasses.ql ql/python/ql/src/Classes/DefineEqualsWhenAddingAttributes.ql ql/python/ql/src/Classes/InconsistentMRO.ql ql/python/ql/src/Classes/InitCallsSubclass/InitCallsSubclassMethod.ql -ql/python/ql/src/Classes/MissingCallToDel.ql -ql/python/ql/src/Classes/MissingCallToInit.ql ql/python/ql/src/Classes/MutatingDescriptor.ql ql/python/ql/src/Classes/OverwritingAttributeInSuperClass.ql ql/python/ql/src/Classes/PropertyInOldStyleClass.ql ql/python/ql/src/Classes/SlotsInOldStyleClass.ql ql/python/ql/src/Classes/SubclassShadowing/SubclassShadowing.ql ql/python/ql/src/Classes/SuperInOldStyleClass.ql -ql/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql -ql/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql ql/python/ql/src/Classes/WrongNameForArgumentInClassInstantiation.ql ql/python/ql/src/Classes/WrongNumberArgumentsInClassInstantiation.ql ql/python/ql/src/Diagnostics/ExtractedFiles.ql diff --git a/python/ql/lib/CHANGELOG.md b/python/ql/lib/CHANGELOG.md index eddd592be743..6a4fefd44467 100644 --- a/python/ql/lib/CHANGELOG.md +++ b/python/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 4.0.15 + +No user-facing changes. + ## 4.0.14 ### Minor Analysis Improvements diff --git a/python/ql/lib/analysis/DefinitionTracking.qll b/python/ql/lib/analysis/DefinitionTracking.qll index 5a9811f62488..e015d0f70a97 100644 --- a/python/ql/lib/analysis/DefinitionTracking.qll +++ b/python/ql/lib/analysis/DefinitionTracking.qll @@ -83,7 +83,7 @@ private predicate ssa_phi_defn(PhiFunction phi, Definition defn) { ssa_variable_defn(phi.getAnInput(), defn) } -/** Holds if the ESSA defn `def` refers to (`value`, `cls`, `origin`) given the context `context`. */ +/** Holds if the ESSA defn `def` refers to (`value`, `cls`, `origin`) given the context `context`. */ private predicate ssa_defn_defn(EssaDefinition def, Definition defn) { ssa_phi_defn(def, defn) or diff --git a/python/ql/lib/change-notes/released/4.0.15.md b/python/ql/lib/change-notes/released/4.0.15.md new file mode 100644 index 000000000000..de5387e3da3f --- /dev/null +++ b/python/ql/lib/change-notes/released/4.0.15.md @@ -0,0 +1,3 @@ +## 4.0.15 + +No user-facing changes. diff --git a/python/ql/lib/codeql-pack.release.yml b/python/ql/lib/codeql-pack.release.yml index 5e4c777a3399..eef62765883a 100644 --- a/python/ql/lib/codeql-pack.release.yml +++ b/python/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 4.0.14 +lastReleaseVersion: 4.0.15 diff --git a/python/ql/lib/experimental/cryptography/CryptoArtifact.qll b/python/ql/lib/experimental/cryptography/CryptoArtifact.qll index fc5c75a4e441..e8939c981113 100644 --- a/python/ql/lib/experimental/cryptography/CryptoArtifact.qll +++ b/python/ql/lib/experimental/cryptography/CryptoArtifact.qll @@ -95,7 +95,7 @@ abstract class CryptographicAlgorithm extends CryptographicArtifact { /** * Normalizes a raw name into a normalized name as found in `CryptoAlgorithmNames.qll`. * Subclassess should override for more api-specific normalization. - * By deafult, converts a raw name to upper-case with no hyphen, underscore, hash, or space. + * By default, converts a raw name to upper-case with no hyphen, underscore, hash, or space. */ bindingset[s] string normalizeName(string s) { diff --git a/python/ql/lib/experimental/cryptography/modules/CryptographyModule.qll b/python/ql/lib/experimental/cryptography/modules/CryptographyModule.qll index 405433b07354..0831d625d803 100644 --- a/python/ql/lib/experimental/cryptography/modules/CryptographyModule.qll +++ b/python/ql/lib/experimental/cryptography/modules/CryptographyModule.qll @@ -117,31 +117,25 @@ module KDF { override predicate requiresIteration() { this.getAlgorithm().getKDFName() in ["PBKDF2HMAC"] } override DataFlow::Node getIterationSizeSrc() { - if this.requiresIteration() - then - // ASSUMPTION: ONLY EVER in arg 3 in PBKDF2HMAC - result = Utils::getUltimateSrcFromApiNode(this.getParameter(3, "iterations")) - else none() + this.requiresIteration() and + // ASSUMPTION: ONLY EVER in arg 3 in PBKDF2HMAC + result = Utils::getUltimateSrcFromApiNode(this.getParameter(3, "iterations")) } override DataFlow::Node getSaltConfigSrc() { - if this.requiresSalt() - then - // SCRYPT has it in arg 1 - if this.getAlgorithm().getKDFName() = "SCRYPT" - then result = Utils::getUltimateSrcFromApiNode(this.getParameter(1, "salt")) - else - // EVERYTHING ELSE that uses salt is in arg 2 - result = Utils::getUltimateSrcFromApiNode(this.getParameter(2, "salt")) - else none() + this.requiresSalt() and + // SCRYPT has it in arg 1 + if this.getAlgorithm().getKDFName() = "SCRYPT" + then result = Utils::getUltimateSrcFromApiNode(this.getParameter(1, "salt")) + else + // EVERYTHING ELSE that uses salt is in arg 2 + result = Utils::getUltimateSrcFromApiNode(this.getParameter(2, "salt")) } override DataFlow::Node getHashConfigSrc() { - if this.requiresHash() - then - // ASSUMPTION: ONLY EVER in arg 0 - result = Utils::getUltimateSrcFromApiNode(this.getParameter(0, "algorithm")) - else none() + this.requiresHash() and + // ASSUMPTION: ONLY EVER in arg 0 + result = Utils::getUltimateSrcFromApiNode(this.getParameter(0, "algorithm")) } // TODO: get encryption algorithm for CBC-based KDF? @@ -152,11 +146,9 @@ module KDF { } override DataFlow::Node getModeSrc() { - if this.requiresMode() - then - // ASSUMPTION: ONLY EVER in arg 1 - result = Utils::getUltimateSrcFromApiNode(this.getParameter(1, "mode")) - else none() + this.requiresMode() and + // ASSUMPTION: ONLY EVER in arg 1 + result = Utils::getUltimateSrcFromApiNode(this.getParameter(1, "mode")) } } } diff --git a/python/ql/lib/experimental/cryptography/modules/stdlib/HashlibModule.qll b/python/ql/lib/experimental/cryptography/modules/stdlib/HashlibModule.qll index 5b2586dc54a6..346512e9a2db 100644 --- a/python/ql/lib/experimental/cryptography/modules/stdlib/HashlibModule.qll +++ b/python/ql/lib/experimental/cryptography/modules/stdlib/HashlibModule.qll @@ -201,7 +201,7 @@ module KDF { // TODO: better modeling of scrypt /** - * Identifies key derivation fucntion hashlib.scrypt accesses. + * Identifies key derivation function hashlib.scrypt accesses. */ class HashlibScryptAlgorithm extends KeyDerivationAlgorithm, KeyDerivationOperation { HashlibScryptAlgorithm() { this = API::moduleImport("hashlib").getMember("scrypt").getACall() } diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index e602a04603fb..a3e40c6586e4 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 4.0.14 +version: 4.0.15 groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/lib/semmle/python/Flow.qll b/python/ql/lib/semmle/python/Flow.qll index c91a492e269e..621013adcd56 100644 --- a/python/ql/lib/semmle/python/Flow.qll +++ b/python/ql/lib/semmle/python/Flow.qll @@ -1259,9 +1259,9 @@ private class ControlFlowNodeAlias = ControlFlowNode; final private class FinalBasicBlock = BasicBlock; module Cfg implements BB::CfgSig { - class ControlFlowNode = ControlFlowNodeAlias; + private import codeql.controlflow.SuccessorType - class SuccessorType = Unit; + class ControlFlowNode = ControlFlowNodeAlias; class BasicBlock extends FinalBasicBlock { // Note `PY:BasicBlock` does not have a `getLocation`. @@ -1275,7 +1275,24 @@ module Cfg implements BB::CfgSig { BasicBlock getASuccessor() { result = super.getASuccessor() } - BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor() and exists(t) } + private BasicBlock getANonDirectSuccessor(SuccessorType t) { + result = this.getATrueSuccessor() and + t.(BooleanSuccessor).getValue() = true + or + result = this.getAFalseSuccessor() and + t.(BooleanSuccessor).getValue() = false + or + result = this.getAnExceptionalSuccessor() and + t instanceof ExceptionSuccessor + } + + BasicBlock getASuccessor(SuccessorType t) { + result = this.getANonDirectSuccessor(t) + or + result = super.getASuccessor() and + t instanceof DirectSuccessor and + not result = this.getANonDirectSuccessor(_) + } predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll index 781023a9658b..c717cd7bc97b 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowDispatch.qll @@ -856,9 +856,14 @@ Class getNextClassInMroKnownStartingClass(Class cls, Class startingClass) { ) } -private Function findFunctionAccordingToMroKnownStartingClass( - Class cls, Class startingClass, string name -) { +/** + * Gets a potential definition of the function `name` of the class `cls` according to our approximation of + * MRO for the class `startingCls` (see `getNextClassInMroKnownStartingClass` for more information). + * + * Note: this is almost the same as `findFunctionAccordingToMro`, except we know the + * `startingClass`, which can give slightly more precise results. + */ +Function findFunctionAccordingToMroKnownStartingClass(Class cls, Class startingClass, string name) { result = cls.getAMethod() and result.getName() = name and cls = getADirectSuperclass*(startingClass) @@ -871,7 +876,7 @@ private Function findFunctionAccordingToMroKnownStartingClass( /** * Gets a potential definition of the function `name` according to our approximation of - * MRO for the class `cls` (see `getNextClassInMroKnownStartingClass` for more information). + * MRO for the class `startingCls` (see `getNextClassInMroKnownStartingClass` for more information). * * Note: this is almost the same as `findFunctionAccordingToMro`, except we know the * `startingClass`, which can give slightly more precise results. diff --git a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll index 4d8d5af50ca3..8ad213de6eb5 100644 --- a/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll +++ b/python/ql/lib/semmle/python/dataflow/new/internal/DataFlowPrivate.qll @@ -613,7 +613,7 @@ DataFlowType getNodeType(Node node) { // Extra flow //-------- /** - * Holds if `pred` can flow to `succ`, by jumping from one callable to + * Holds if `nodeFrom` can flow to `nodeTo`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* * taken into account. */ @@ -634,7 +634,7 @@ predicate jumpStep(Node nodeFrom, Node nodeTo) { * the type-trackers as well, as that would make evaluation of type-tracking recursive * with the new jumpsteps. * - * Holds if `pred` can flow to `succ`, by jumping from one callable to + * Holds if `nodeFrom` can flow to `nodeTo`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* * taken into account. */ @@ -657,7 +657,7 @@ predicate jumpStepSharedWithTypeTracker(Node nodeFrom, Node nodeTo) { * the type-trackers as well, as that would make evaluation of type-tracking recursive * with the new jumpsteps. * - * Holds if `pred` can flow to `succ`, by jumping from one callable to + * Holds if `nodeFrom` can flow to `nodeTo`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* * taken into account. */ @@ -766,7 +766,7 @@ module Orm { abstract predicate storeStep(Node nodeFrom, Content c, Node nodeTo); /** - * Holds if `pred` can flow to `succ`, by jumping from one callable to + * Holds if `nodeFrom` can flow to `nodeTo`, by jumping from one callable to * another. Additional steps specified by the configuration are *not* * taken into account. */ diff --git a/python/ql/lib/semmle/python/frameworks/Stdlib.qll b/python/ql/lib/semmle/python/frameworks/Stdlib.qll index ceb2f1952a02..c6b671e8b781 100644 --- a/python/ql/lib/semmle/python/frameworks/Stdlib.qll +++ b/python/ql/lib/semmle/python/frameworks/Stdlib.qll @@ -3702,11 +3702,8 @@ module StdlibPrivate { * A call to a find method on a tree or an element will execute an XPath expression. */ private class ElementTreeFindCall extends XML::XPathExecution::Range, DataFlow::CallCfgNode { - string methodName; - ElementTreeFindCall() { - methodName in ["find", "findall", "findtext"] and - ( + exists(string methodName | methodName in ["find", "findall", "findtext"] | this = elementTreeInstance().getMember(methodName).getACall() or this = elementInstance().getMember(methodName).getACall() diff --git a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll index b86d7de457ee..4969da43be34 100644 --- a/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll +++ b/python/ql/lib/semmle/python/frameworks/data/internal/ApiGraphModelsExtensions.qll @@ -4,7 +4,7 @@ /** * Holds if the value at `(type, path)` should be seen as a flow - * source of the given `kind`. + * source of the given `kind` and `madId` is the data extension row number. * * The kind `remote` represents a general remote flow source. */ @@ -14,13 +14,14 @@ extensible predicate sourceModel( /** * Holds if the value at `(type, path)` should be seen as a sink - * of the given `kind`. + * of the given `kind` and `madId` is the data extension row number. */ extensible predicate sinkModel(string type, string path, string kind, QlBuiltins::ExtensionId madId); /** * Holds if in calls to `(type, path)`, the value referred to by `input` - * can flow to the value referred to by `output`. + * can flow to the value referred to by `output` and `madId` is the data + * extension row number. * * `kind` should be either `value` or `taint`, for value-preserving or taint-preserving steps, * respectively. diff --git a/python/ql/lib/semmle/python/objects/ObjectInternal.qll b/python/ql/lib/semmle/python/objects/ObjectInternal.qll index a58b8b5f0a91..aa78caa2c9d7 100644 --- a/python/ql/lib/semmle/python/objects/ObjectInternal.qll +++ b/python/ql/lib/semmle/python/objects/ObjectInternal.qll @@ -174,9 +174,9 @@ class ObjectInternal extends TObject { abstract int length(); /** - * Holds if the object `function` is called when this object is called and `paramOffset` + * Holds if the object `function` is called when this object is called and `offset` * is the difference from the parameter position and the argument position. - * For a normal function `paramOffset` is 0. For classes and bound-methods it is 1. + * For a normal function `offset` is 0. For classes and bound-methods it is 1. * This is used to implement the `CallableValue` public API. */ predicate functionAndOffset(CallableObjectInternal function, int offset) { none() } diff --git a/python/ql/lib/semmle/python/types/FunctionObject.qll b/python/ql/lib/semmle/python/types/FunctionObject.qll index d52a885a832c..f64c02b9c6bf 100644 --- a/python/ql/lib/semmle/python/types/FunctionObject.qll +++ b/python/ql/lib/semmle/python/types/FunctionObject.qll @@ -46,9 +46,7 @@ abstract class FunctionObject extends Object { ControlFlowNode getACall() { result = this.theCallable().getACall() } /** Gets a call-site from where this function is called, given the `context` */ - ControlFlowNode getACall(Context caller_context) { - result = this.theCallable().getACall(caller_context) - } + ControlFlowNode getACall(Context context) { result = this.theCallable().getACall(context) } /** * Gets the `ControlFlowNode` that will be passed as the nth argument to `this` when called at `call`. diff --git a/python/ql/src/CHANGELOG.md b/python/ql/src/CHANGELOG.md index 0c22d526f395..de3fc1ddf2b5 100644 --- a/python/ql/src/CHANGELOG.md +++ b/python/ql/src/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.6.5 + +### Minor Analysis Improvements + +* The queries `py/missing-call-to-init`, `py/missing-calls-to-del`, `py/multiple-calls-to-init`, and `py/multiple-calls-to-del` queries have been modernized; no longer relying on outdated libraries, producing more precise results with more descriptive alert messages, and improved documentation. + ## 1.6.4 ### Minor Analysis Improvements diff --git a/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll new file mode 100644 index 000000000000..635953168d7a --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/MethodCallOrder.qll @@ -0,0 +1,207 @@ +/** Definitions for reasoning about multiple or missing calls to superclass methods. */ + +import python +import semmle.python.ApiGraphs +import semmle.python.dataflow.new.internal.DataFlowDispatch +import codeql.util.Option + +/** Holds if `meth` is a method named `name` that transitively calls `calledMulti` of the same name via the calls `call1` and `call2`. */ +predicate multipleCallsToSuperclassMethod( + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2, string name +) { + exists(Class cls | + meth.getName() = name and + meth.getScope() = cls and + locationBefore(call1.getLocation(), call2.getLocation()) and + rankedSuperCallByLocation(1, cls, meth, call1, name, calledMulti) and + rankedSuperCallByLocation(2, cls, meth, call2, name, calledMulti) and + nonTrivial(calledMulti) + ) +} + +predicate rankedSuperCallByLocation( + int i, Class mroBase, Function meth, DataFlow::MethodCallNode call, string name, Function target +) { + call = + rank[i](DataFlow::MethodCallNode calli | + target = getASuperCallTargetFromCall(mroBase, meth, calli, name) + | + calli order by calli.getLocation().getStartLine(), calli.getLocation().getStartColumn() + ) +} + +/** Holds if l1 comes before l2, assuming they're in the same file. */ +pragma[inline] +private predicate locationBefore(Location l1, Location l2) { + l1.getStartLine() < l2.getStartLine() + or + l1.getStartLine() = l2.getStartLine() and + l1.getStartColumn() < l2.getStartColumn() +} + +/** Gets a method transitively called by `meth` named `name` with `call` that it overrides, with `mroBase` as the type determining the MRO to search. */ +Function getASuperCallTargetFromCall( + Class mroBase, Function meth, DataFlow::MethodCallNode call, string name +) { + exists(Function target | target = getDirectSuperCallTargetFromCall(mroBase, meth, call, name) | + result = target + or + result = getASuperCallTargetFromCall(mroBase, target, _, name) + ) +} + +/** Gets the method called by `meth` named `name` with `call`, with `mroBase` as the type determining the MRO to search. */ +Function getDirectSuperCallTargetFromCall( + Class mroBase, Function meth, DataFlow::MethodCallNode call, string name +) { + meth = call.getScope() and + meth.getName() = name and + call.calls(_, name) and + mroBase = getADirectSubclass*(meth.getScope()) and + exists(Class targetCls | + // the differences between 0-arg and 2-arg super is not considered; we assume each super uses the mro of the instance `self` + superCall(call, _) and + targetCls = getNextClassInMroKnownStartingClass(meth.getScope(), mroBase) and + result = findFunctionAccordingToMroKnownStartingClass(targetCls, mroBase, name) + or + // targetCls is the mro base for this lookup. + // note however that if the call we find uses super(), that still uses the mro of the instance `self` + // assuming it's 0-arg or is 2-arg with `self` as second arg. + callsMethodOnClassWithSelf(meth, call, targetCls, _) and + result = findFunctionAccordingToMroKnownStartingClass(targetCls, targetCls, name) + ) +} + +/** Gets a method that is transitively called by a call to `cls.`, with `mroBase` as the type determining the MRO to search. */ +Function getASuperCallTargetFromClass(Class mroBase, Class cls, string name) { + exists(Function target | + target = findFunctionAccordingToMroKnownStartingClass(cls, mroBase, name) and + ( + result = target + or + result = getASuperCallTargetFromCall(mroBase, target, _, name) + ) + ) +} + +/** Holds if `meth` does something besides calling a superclass method. */ +predicate nonTrivial(Function meth) { + exists(Stmt s | s = meth.getAStmt() | + not s instanceof Pass and + not exists(DataFlow::Node call | call.asExpr() = s.(ExprStmt).getValue() | + superCall(call, meth.getName()) + or + callsMethodOnClassWithSelf(meth, call, _, meth.getName()) + ) + ) and + exists(meth.getANormalExit()) // doesn't always raise an exception +} + +/** Holds if `call` is a call to `super().`. No distinction is made between 0- and 2- arg super calls. */ +predicate superCall(DataFlow::MethodCallNode call, string name) { + exists(DataFlow::Node sup | + call.calls(sup, name) and + sup = API::builtin("super").getACall() + ) +} + +/** Holds if `meth` calls a `super()` method of the same name. */ +predicate callsSuper(Function meth) { + exists(DataFlow::MethodCallNode call | + call.getScope() = meth and + superCall(call, meth.getName()) + ) +} + +/** Holds if `meth` calls `target.(self, ...)` with the call `call`. */ +predicate callsMethodOnClassWithSelf( + Function meth, DataFlow::MethodCallNode call, Class target, string name +) { + exists(DataFlow::Node callTarget, DataFlow::ParameterNode self | + call.calls(callTarget, name) and + self.getParameter() = meth.getArg(0) and + self.(DataFlow::LocalSourceNode).flowsTo(call.getArg(0)) and + callTarget = classTracker(target) + ) +} + +/** Holds if `meth` calls a method named `name` passing its `self` argument as its first parameter, but the class it refers to is unknown. */ +predicate callsMethodOnUnknownClassWithSelf(Function meth, string name) { + exists(DataFlow::MethodCallNode call, DataFlow::Node callTarget, DataFlow::ParameterNode self | + call.calls(callTarget, name) and + self.getParameter() = meth.getArg(0) and + self.(DataFlow::LocalSourceNode).flowsTo(call.getArg(0)) and + not callTarget = classTracker(any(Class target)) + ) +} + +/** Holds if `base` does not call a superclass method `shouldCall` named `name` when it appears it should. */ +predicate missingCallToSuperclassMethod(Class base, Function shouldCall, string name) { + shouldCall.getName() = name and + shouldCall.getScope() = getADirectSuperclass+(base) and + not shouldCall = getASuperCallTargetFromClass(base, base, name) and + nonTrivial(shouldCall) and + // "Benefit of the doubt" - if somewhere in the chain we call an unknown superclass, assume all the necessary parent methods are called from it + not callsMethodOnUnknownClassWithSelf(getASuperCallTargetFromClass(base, base, name), name) +} + +/** + * Holds if `base` does not call a superclass method `shouldCall` named `name` when it appears it should. + * Results are restricted to hold only for the highest `base` class and the lowest `shouldCall` method in the hierarchy for which this applies. + */ +predicate missingCallToSuperclassMethodRestricted(Class base, Function shouldCall, string name) { + missingCallToSuperclassMethod(base, shouldCall, name) and + not exists(Class superBase | + // Alert only on the highest base class that has the issue + superBase = getADirectSuperclass+(base) and + missingCallToSuperclassMethod(superBase, shouldCall, name) + ) and + not exists(Function subShouldCall | + // Mention in the alert only the lowest method we're missing the call to + subShouldCall.getScope() = getADirectSubclass+(shouldCall.getScope()) and + missingCallToSuperclassMethod(base, subShouldCall, name) + ) +} + +/** + * If `base` contains a `super()` call, gets a method in the inheritance hierarchy of `name` in the MRO of `base` + * that does not contain a `super()` call, but would call `shouldCall` if it did, which does not otherwise get called + * during a call to `base.`. + */ +Function getPossibleMissingSuper(Class base, Function shouldCall, string name) { + missingCallToSuperclassMethod(base, shouldCall, name) and + exists(Function baseMethod | + baseMethod.getScope() = base and + baseMethod.getName() = name and + // the base method calls super, so is presumably expecting every method called in the MRO chain to do so + callsSuper(baseMethod) and + // result is something that does get called in the chain + result = getASuperCallTargetFromClass(base, base, name) and + // it doesn't call super + not callsSuper(result) and + // if it did call super, it would resolve to the missing method + shouldCall = + findFunctionAccordingToMroKnownStartingClass(getNextClassInMroKnownStartingClass(result + .getScope(), base), base, name) + ) +} + +/** An optional `Function`. */ +class FunctionOption extends LocatableOption::Option { + /** Gets the qualified name of this function, or the empty string if it is None. */ + string getQualifiedName() { + this.isNone() and result = "" + or + result = this.asSome().getQualifiedName() + } +} + +/** Gets the result of `getPossibleMissingSuper`, or None if none exists. */ +bindingset[name] +FunctionOption getPossibleMissingSuperOption(Class base, Function shouldCall, string name) { + result.asSome() = getPossibleMissingSuper(base, shouldCall, name) + or + not exists(getPossibleMissingSuper(base, shouldCall, name)) and + result.isNone() +} diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp new file mode 100644 index 000000000000..83aac7629eba --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.qhelp @@ -0,0 +1,52 @@ + + + + +

    +Python, unlike some other object-oriented languages such as Java, allows the developer complete freedom in +when and how superclass finalizers are called during object finalization. +However, the developer has responsibility for ensuring that objects are properly cleaned up, and that all superclass __del__ +methods are called. +

    +

    +Classes with a __del__ method (a finalizer) typically hold some resource such as a file handle that needs to be cleaned up. +If the __del__ method of a superclass is not called during object finalization, it is likely that +resources may be leaked. +

    + +

    A call to the __del__ method of a superclass during object initialization may be unintentionally skipped: +

    +
      +
    • If a subclass calls the __del__ method of the wrong class.
    • +
    • If a call to the __del__ method of one its base classes is omitted.
    • +
    • If a call to super().__del__ is used, but not all __del__ methods in the Method Resolution Order (MRO) + chain themselves call super(). This in particular arises more often in cases of multiple inheritance.
    • +
    + + +
    + +

    Ensure that all superclass __del__ methods are properly called. +Either each base class's finalize method should be explicitly called, or super() calls +should be consistently used throughout the inheritance hierarchy.

    + + +
    + +

    In the following example, explicit calls to __del__ are used, but SportsCar erroneously calls +Vehicle.__del__. This is fixed in FixedSportsCar by calling Car.__del__. +

    + + + +
    + + +
  • Python Reference: __del__.
  • +
  • Python Standard Library: super.
  • +
  • Python Glossary: Method resolution order.
  • + +
    +
    diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql new file mode 100644 index 000000000000..7d8e11b569d7 --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToDel.ql @@ -0,0 +1,49 @@ +/** + * @name Missing call to superclass `__del__` during object destruction + * @description An omitted call to a superclass `__del__` method may lead to class instances not being cleaned up properly. + * @kind problem + * @tags quality + * reliability + * correctness + * performance + * @problem.severity error + * @sub-severity low + * @precision high + * @id py/missing-call-to-delete + */ + +import python +import MethodCallOrder + +Function getDelMethod(Class c) { + result = c.getAMethod() and + result.getName() = "__del__" +} + +from Class base, Function shouldCall, FunctionOption possibleIssue, string msg +where + not exists(Function newMethod | newMethod = base.getAMethod() and newMethod.getName() = "__new__") and + exists(FunctionOption possiblyMissingSuper | + missingCallToSuperclassMethodRestricted(base, shouldCall, "__del__") and + possiblyMissingSuper = getPossibleMissingSuperOption(base, shouldCall, "__del__") and + ( + not possiblyMissingSuper.isNone() and + possibleIssue = possiblyMissingSuper and + msg = + "This class does not call $@ during finalization. ($@ may be missing a call to super().__del__)" + or + possiblyMissingSuper.isNone() and + ( + possibleIssue.asSome() = getDelMethod(base) and + msg = + "This class does not call $@ during finalization. ($@ may be missing a call to a base class __del__)" + or + not exists(getDelMethod(base)) and + possibleIssue.isNone() and + msg = + "This class does not call $@ during finalization. (The class lacks an __del__ method to ensure every base class __del__ is called.)" + ) + ) + ) +select base, msg, shouldCall, shouldCall.getQualifiedName(), possibleIssue, + possibleIssue.getQualifiedName() diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp new file mode 100644 index 000000000000..76121446f99e --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.qhelp @@ -0,0 +1,50 @@ + + + + +

    Python, unlike some other object-oriented languages such as Java, allows the developer complete freedom in +when and how superclass initializers are called during object initialization. +However, the developer has responsibility for ensuring that objects are properly initialized, and that all superclass __init__ +methods are called. +

    +

    +If the __init__ method of a superclass is not called during object initialization, this can lead to errors due to +the object not being fully initialized, such as having missing attributes. +

    + +

    A call to the __init__ method of a superclass during object initialization may be unintentionally skipped: +

    +
      +
    • If a subclass calls the __init__ method of the wrong class.
    • +
    • If a call to the __init__ method of one its base classes is omitted.
    • +
    • If a call to super().__init__ is used, but not all __init__ methods in the Method Resolution Order (MRO) + chain themselves call super(). This in particular arises more often in cases of multiple inheritance.
    • +
    + + +
    + +

    Ensure that all superclass __init__ methods are properly called. +Either each base class's initialize method should be explicitly called, or super() calls +should be consistently used throughout the inheritance hierarchy.

    + + +
    + +

    In the following example, explicit calls to __init__ are used, but SportsCar erroneously calls +Vehicle.__init__. This is fixed in FixedSportsCar by calling Car.__init__. +

    + + + +
    + + +
  • Python Reference: __init__.
  • +
  • Python Standard Library: super.
  • +
  • Python Glossary: Method resolution order.
  • + +
    +
    diff --git a/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql new file mode 100644 index 000000000000..566d8320a29b --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/MissingCallToInit.ql @@ -0,0 +1,41 @@ +/** + * @name Missing call to superclass `__init__` during object initialization + * @description An omitted call to a superclass `__init__` method may lead to objects of this class not being fully initialized. + * @kind problem + * @tags quality + * reliability + * correctness + * @problem.severity error + * @sub-severity low + * @precision high + * @id py/missing-call-to-init + */ + +import python +import MethodCallOrder + +from Class base, Function shouldCall, FunctionOption possibleIssue, string msg +where + exists(FunctionOption possiblyMissingSuper | + missingCallToSuperclassMethodRestricted(base, shouldCall, "__init__") and + possiblyMissingSuper = getPossibleMissingSuperOption(base, shouldCall, "__init__") and + ( + possibleIssue.asSome() = possiblyMissingSuper.asSome() and + msg = + "This class does not call $@ during initialization. ($@ may be missing a call to super().__init__)" + or + possiblyMissingSuper.isNone() and + ( + possibleIssue.asSome() = base.getInitMethod() and + msg = + "This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__)" + or + not exists(base.getInitMethod()) and + possibleIssue.isNone() and + msg = + "This class does not call $@ during initialization. (The class lacks an __init__ method to ensure every base class __init__ is called.)" + ) + ) + ) +select base, msg, shouldCall, shouldCall.getQualifiedName(), possibleIssue, + possibleIssue.getQualifiedName() diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp new file mode 100644 index 000000000000..df9c073fcceb --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.qhelp @@ -0,0 +1,55 @@ + + + + +

    +Python, unlike some other object-oriented languages such as Java, allows the developer complete freedom in +when and how superclass finalizers are called during object finalization. +However, the developer has responsibility for ensuring that objects are properly cleaned up. +

    + +

    +Objects with a __del__ method (a finalizer) often hold resources such as file handles that need to be cleaned up. +If a superclass finalizer is called multiple times, this may lead to errors such as closing an already closed file, and lead to objects not being +cleaned up properly as expected. +

    + +

    There are a number of ways that a __del__ method may be be called more than once.

    +
      +
    • There may be more than one explicit call to the method in the hierarchy of __del__ methods.
    • +
    • In situations involving multiple inheritance, an finalization method may call the finalizers of each of its base types, + which themselves both call the finalizer of a shared base type. (This is an example of the Diamond Inheritance problem)
    • +
    • Another situation involving multiple inheritance arises when a subclass calls the __del__ methods of each of its base classes, + one of which calls super().__del__. This super call resolves to the next class in the Method Resolution Order (MRO) of the subclass, + which may be another base class that already has its initializer explicitly called.
    • +
    + + +
    + +

    Ensure that each finalizer method is called exactly once during finalization. +This can be ensured by calling super().__del__ for each finalizer method in the inheritance chain. +

    + +
    + + +

    In the following example, there is a mixture of explicit calls to __del__ and calls using super(), resulting in Vehicle.__del__ +being called twice. +FixedSportsCar.__del__ fixes this by using super() consistently with the other delete methods. +

    + + + +
    + + +
  • Python Reference: __del__.
  • +
  • Python Standard Library: super.
  • +
  • Python Glossary: Method resolution order.
  • +
  • Wikipedia: The Diamond Problem.
  • + +
    +
    diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql new file mode 100644 index 000000000000..dfdc3545e64f --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql @@ -0,0 +1,47 @@ +/** + * @name Multiple calls to `__del__` during object destruction + * @description A duplicated call to a superclass `__del__` method may lead to class instances not be cleaned up properly. + * @kind problem + * @tags quality + * reliability + * correctness + * @problem.severity warning + * @sub-severity high + * @precision very-high + * @id py/multiple-calls-to-delete + */ + +import python +import MethodCallOrder + +predicate multipleCallsToSuperclassDel( + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2 +) { + multipleCallsToSuperclassMethod(meth, calledMulti, call1, call2, "__del__") +} + +from + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2, Function target1, Function target2, string msg +where + multipleCallsToSuperclassDel(meth, calledMulti, call1, call2) and + // Only alert for the lowest method in the hierarchy that both calls will call. + not exists(Function subMulti | + multipleCallsToSuperclassDel(meth, subMulti, _, _) and + calledMulti.getScope() = getADirectSuperclass+(subMulti.getScope()) + ) and + target1 = getDirectSuperCallTargetFromCall(meth.getScope(), meth, call1, _) and + target2 = getDirectSuperCallTargetFromCall(meth.getScope(), meth, call2, _) and + ( + target1 != target2 and + msg = + "This finalization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively." + or + target1 = target2 and + // The targets themselves are called multiple times (either is calledMulti, or something earlier in the MRO) + // Mentioning them again would be redundant. + msg = "This finalization method calls $@ multiple times, via $@ and $@." + ) +select meth, msg, calledMulti, calledMulti.getQualifiedName(), call1, "this call", call2, + "this call", target1, target1.getQualifiedName(), target2, target2.getQualifiedName() diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp new file mode 100644 index 000000000000..d7060adef8d9 --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.qhelp @@ -0,0 +1,74 @@ + + + + +

    Python, unlike some other object-oriented languages such as Java, allows the developer complete freedom in +when and how superclass initializers are called during object initialization. +However, the developer has responsibility for ensuring that objects are properly initialized. +

    + +

    +Calling an __init__ method more than once during object initialization risks the object being incorrectly +initialized, as the method and the rest of the inheritance chain may not have been written with the expectation +that it could be called multiple times. For example, it may set attributes to a default value in a way that unexpectedly overwrites +values setting those attributes in a subclass. +

    + +

    There are a number of ways that an __init__ method may be be called more than once.

    +
      +
    • There may be more than one explicit call to the method in the hierarchy of __init__ methods.
    • +
    • In situations involving multiple inheritance, an initialization method may call the initializers of each of its base types, + which themselves both call the initializer of a shared base type. (This is an example of the Diamond Inheritance problem)
    • +
    • Another situation involving multiple inheritance arises when a subclass calls the __init__ methods of each of its base classes, + one of which calls super().__init__. This super call resolves to the next class in the Method Resolution Order (MRO) of the subclass, + which may be another base class that already has its initializer explicitly called.
    • +
    + + +
    + +

    +Take care whenever possible not to call an an initializer multiple times. If each __init__ method in the hierarchy +calls super().__init__(), then each initializer will be called exactly once according to the MRO of the subclass. + +When explicitly calling base class initializers (such as to pass different arguments to different initializers), +ensure this is done consistently throughout, rather than using super() calls in the base classes. +

    +

    +In some cases, it may not be possible to avoid calling a base initializer multiple times without significant refactoring. +In this case, carefully check that the initializer does not interfere with subclass initializers + when called multiple times (such as by overwriting attributes), and ensure this behavior is documented. +

    + + +
    + +

    In the following (BAD) example, the class D calls B.__init__ and C.__init__, +which each call A.__init__. This results in self.state being set to None as +A.__init__ is called again after B.__init__ had finished. This may lead to unexpected results. +

    + + + +

    In the following (GOOD) example, a call to super().__init__ is made in each class +in the inheritance hierarchy, ensuring each initializer is called exactly once. +

    + + + +

    In the following (BAD) example, explicit base class calls are mixed with super() calls, and C.__init__ is called twice.

    + + +
    + + +
  • Python Reference: __init__.
  • +
  • Python Standard Library: super.
  • +
  • Python Glossary: Method resolution order.
  • +
  • Wikipedia: The Diamond Problem.
  • + + +
    +
    diff --git a/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql new file mode 100644 index 000000000000..04c226aa1951 --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql @@ -0,0 +1,47 @@ +/** + * @name Multiple calls to `__init__` during object initialization + * @description A duplicated call to a superclass `__init__` method may lead to objects of this class not being properly initialized. + * @kind problem + * @tags quality + * reliability + * correctness + * @problem.severity warning + * @sub-severity high + * @precision very-high + * @id py/multiple-calls-to-init + */ + +import python +import MethodCallOrder + +predicate multipleCallsToSuperclassInit( + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2 +) { + multipleCallsToSuperclassMethod(meth, calledMulti, call1, call2, "__init__") +} + +from + Function meth, Function calledMulti, DataFlow::MethodCallNode call1, + DataFlow::MethodCallNode call2, Function target1, Function target2, string msg +where + multipleCallsToSuperclassInit(meth, calledMulti, call1, call2) and + // Only alert for the lowest method in the hierarchy that both calls will call. + not exists(Function subMulti | + multipleCallsToSuperclassInit(meth, subMulti, _, _) and + calledMulti.getScope() = getADirectSuperclass+(subMulti.getScope()) + ) and + target1 = getDirectSuperCallTargetFromCall(meth.getScope(), meth, call1, _) and + target2 = getDirectSuperCallTargetFromCall(meth.getScope(), meth, call2, _) and + ( + target1 != target2 and + msg = + "This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively." + or + target1 = target2 and + // The targets themselves are called multiple times (either is calledMulti, or something earlier in the MRO) + // Mentioning them again would be redundant. + msg = "This initialization method calls $@ multiple times, via $@ and $@." + ) +select meth, msg, calledMulti, calledMulti.getQualifiedName(), call1, "this call", call2, + "this call", target1, target1.getQualifiedName(), target2, target2.getQualifiedName() diff --git a/python/ql/src/Classes/MissingCallToDel.py b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py similarity index 86% rename from python/ql/src/Classes/MissingCallToDel.py rename to python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py index 37520071b3ae..296d36be7d8f 100644 --- a/python/ql/src/Classes/MissingCallToDel.py +++ b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToDel.py @@ -10,14 +10,14 @@ def __del__(self): recycle(self.car_parts) Vehicle.__del__(self) -#Car.__del__ is missed out. +#BAD: Car.__del__ is not called. class SportsCar(Car, Vehicle): def __del__(self): recycle(self.sports_car_parts) Vehicle.__del__(self) -#Fix SportsCar by calling Car.__del__ +#GOOD: Car.__del__ is called correctly. class FixedSportsCar(Car, Vehicle): def __del__(self): diff --git a/python/ql/src/Classes/MissingCallToInit.py b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToInit.py similarity index 85% rename from python/ql/src/Classes/MissingCallToInit.py rename to python/ql/src/Classes/CallsToInitDel/examples/MissingCallToInit.py index 1b3e0e3aee59..14d7c5a80fd3 100644 --- a/python/ql/src/Classes/MissingCallToInit.py +++ b/python/ql/src/Classes/CallsToInitDel/examples/MissingCallToInit.py @@ -10,14 +10,14 @@ def __init__(self): Vehicle.__init__(self) self.car_init() -#Car.__init__ is missed out. +# BAD: Car.__init__ is not called. class SportsCar(Car, Vehicle): def __init__(self): Vehicle.__init__(self) self.sports_car_init() -#Fix SportsCar by calling Car.__init__ +# GOOD: Car.__init__ is called correctly. class FixedSportsCar(Car, Vehicle): def __init__(self): diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes2.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py similarity index 85% rename from python/ql/src/Classes/SuperclassDelCalledMultipleTimes2.py rename to python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py index 8cb1433ac0c4..f48f325f8b57 100644 --- a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes2.py +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassDelCalledMultipleTimes.py @@ -15,14 +15,14 @@ def __del__(self): class SportsCar(Car, Vehicle): - # Vehicle.__del__ will get called twice + # BAD: Vehicle.__del__ will get called twice def __del__(self): recycle(self.sports_car_parts) Car.__del__(self) Vehicle.__del__(self) -#Fix SportsCar by using super() +# GOOD: super() is used ensuring each del method is called once. class FixedSportsCar(Car, Vehicle): def __del__(self): diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad1.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad1.py new file mode 100644 index 000000000000..0f595a534dac --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad1.py @@ -0,0 +1,20 @@ +class A: + def __init__(self): + self.state = None + +class B(A): + def __init__(self): + A.__init__(self) + self.state = "B" + self.b = 3 + +class C(A): + def __init__(self): + A.__init__(self) + self.c = 2 + +class D(B,C): + def __init__(self): + B.__init__(self) + C.__init__(self) # BAD: This calls A.__init__ a second time, setting self.state to None. + diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad3.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad3.py new file mode 100644 index 000000000000..9a70876e7a85 --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesBad3.py @@ -0,0 +1,22 @@ +class A: + def __init__(self): + print("A") + self.state = None + +class B(A): + def __init__(self): + print("B") + super().__init__() # When called from D, this calls C.__init__ + self.state = "B" + self.b = 3 + +class C(A): + def __init__(self): + print("C") + super().__init__() + self.c = 2 + +class D(B,C): + def __init__(self): + B.__init__(self) + C.__init__(self) # BAD: C.__init__ is called a second time \ No newline at end of file diff --git a/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py new file mode 100644 index 000000000000..9e4bbdea0584 --- /dev/null +++ b/python/ql/src/Classes/CallsToInitDel/examples/SuperclassInitCalledMultipleTimesGood2.py @@ -0,0 +1,22 @@ +class A: + def __init__(self): + self.state = None + +class B(A): + def __init__(self): + super().__init__() + self.state = "B" + self.b = 3 + +class C(A): + def __init__(self): + super().__init__() + self.c = 2 + +class D(B,C): + def __init__(self): # GOOD: Each method calls super, so each init method runs once. self.state will be set to "B". + super().__init__() + self.d = 1 + + + diff --git a/python/ql/src/Classes/MethodCallOrder.qll b/python/ql/src/Classes/MethodCallOrder.qll index 620cb8028780..b911ee0183e1 100644 --- a/python/ql/src/Classes/MethodCallOrder.qll +++ b/python/ql/src/Classes/MethodCallOrder.qll @@ -1,3 +1,5 @@ +deprecated module; + import python // Helper predicates for multiple call to __init__/__del__ queries. diff --git a/python/ql/src/Classes/MissingCallToDel.qhelp b/python/ql/src/Classes/MissingCallToDel.qhelp deleted file mode 100644 index 864ddd1b56b8..000000000000 --- a/python/ql/src/Classes/MissingCallToDel.qhelp +++ /dev/null @@ -1,50 +0,0 @@ - - - - -

    Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object destruction. -However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. -Therefore the developer has responsibility for ensuring that objects are properly cleaned up when -there are multiple __del__ methods that need to be called. -

    -

    -If the __del__ method of a superclass is not called during object destruction it is likely that -that resources may be leaked. -

    - -

    A call to the __del__ method of a superclass during object destruction may be omitted: -

    -
      -
    • When a subclass calls the __del__ method of the wrong class.
    • -
    • When a call to the __del__ method of one its base classes is omitted.
    • -
    - - -
    - -

    Either be careful to explicitly call the __del__ of the correct base class, or -use super() throughout the inheritance hierarchy.

    - -

    Alternatively refactor one or more of the classes to use composition rather than inheritance.

    - - -
    - -

    In this example, explicit calls to __del__ are used, but SportsCar erroneously calls -Vehicle.__del__. This is fixed in FixedSportsCar by calling Car.__del__. -

    - - - -
    - - -
  • Python Tutorial: Classes.
  • -
  • Python Standard Library: super.
  • -
  • Artima Developer: Things to Know About Python Super.
  • -
  • Wikipedia: Composition over inheritance.
  • - -
    -
    diff --git a/python/ql/src/Classes/MissingCallToDel.ql b/python/ql/src/Classes/MissingCallToDel.ql deleted file mode 100644 index be49dc48b5f4..000000000000 --- a/python/ql/src/Classes/MissingCallToDel.ql +++ /dev/null @@ -1,26 +0,0 @@ -/** - * @name Missing call to `__del__` during object destruction - * @description An omitted call to a super-class `__del__` method may lead to class instances not being cleaned up properly. - * @kind problem - * @tags quality - * reliability - * correctness - * performance - * @problem.severity error - * @sub-severity low - * @precision high - * @id py/missing-call-to-delete - */ - -import python -import MethodCallOrder - -from ClassObject self, FunctionObject missing -where - missing_call_to_superclass_method(self, _, missing, "__del__") and - not missing.neverReturns() and - not self.failedInference() and - not missing.isBuiltin() -select self, - "Class " + self.getName() + " may not be cleaned up properly as $@ is not called during deletion.", - missing, missing.descriptiveString() diff --git a/python/ql/src/Classes/MissingCallToInit.qhelp b/python/ql/src/Classes/MissingCallToInit.qhelp deleted file mode 100644 index 31ad3d693a5d..000000000000 --- a/python/ql/src/Classes/MissingCallToInit.qhelp +++ /dev/null @@ -1,52 +0,0 @@ - - - - -

    Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object initialization. -However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. -Therefore the developer has responsibility for ensuring that objects are properly initialized when -there are multiple __init__ methods that need to be called. -

    -

    -If the __init__ method of a superclass is not called during object initialization it is likely that -that object will end up in an incorrect state. -

    - -

    A call to the __init__ method of a superclass during object initialization may be omitted: -

    -
      -
    • When a subclass calls the __init__ method of the wrong class.
    • -
    • When a call to the __init__ method of one its base classes is omitted.
    • -
    • When multiple inheritance is used and a class inherits from several base classes, - and at least one of those does not use super() in its own __init__ method.
    • -
    - - -
    - -

    Either be careful to explicitly call the __init__ of the correct base class, or -use super() throughout the inheritance hierarchy.

    - -

    Alternatively refactor one or more of the classes to use composition rather than inheritance.

    - - -
    - -

    In this example, explicit calls to __init__ are used, but SportsCar erroneously calls -Vehicle.__init__. This is fixed in FixedSportsCar by calling Car.__init__. -

    - - - -
    - - -
  • Python Tutorial: Classes.
  • -
  • Python Standard Library: super.
  • -
  • Artima Developer: Things to Know About Python Super.
  • -
  • Wikipedia: Composition over inheritance.
  • - -
    -
    diff --git a/python/ql/src/Classes/MissingCallToInit.ql b/python/ql/src/Classes/MissingCallToInit.ql deleted file mode 100644 index 4f5d3d90e84a..000000000000 --- a/python/ql/src/Classes/MissingCallToInit.ql +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @name Missing call to `__init__` during object initialization - * @description An omitted call to a super-class `__init__` method may lead to objects of this class not being fully initialized. - * @kind problem - * @tags quality - * reliability - * correctness - * @problem.severity error - * @sub-severity low - * @precision high - * @id py/missing-call-to-init - */ - -import python -import MethodCallOrder - -from ClassObject self, FunctionObject initializer, FunctionObject missing -where - self.lookupAttribute("__init__") = initializer and - missing_call_to_superclass_method(self, initializer, missing, "__init__") and - // If a superclass is incorrect, don't flag this class as well. - not missing_call_to_superclass_method(self.getASuperType(), _, missing, "__init__") and - not missing.neverReturns() and - not self.failedInference() and - not missing.isBuiltin() and - not self.isAbstract() -select self, - "Class " + self.getName() + " may not be initialized properly as $@ is not called from its $@.", - missing, missing.descriptiveString(), initializer, "__init__ method" diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.py b/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.py deleted file mode 100644 index 0ee6e61bcb1a..000000000000 --- a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.py +++ /dev/null @@ -1,29 +0,0 @@ -#Calling a method multiple times by using explicit calls when a base inherits from other base -class Vehicle(object): - - def __del__(self): - recycle(self.base_parts) - - -class Car(Vehicle): - - def __del__(self): - recycle(self.car_parts) - Vehicle.__del__(self) - - -class SportsCar(Car, Vehicle): - - # Vehicle.__del__ will get called twice - def __del__(self): - recycle(self.sports_car_parts) - Car.__del__(self) - Vehicle.__del__(self) - - -#Fix SportsCar by only calling Car.__del__ -class FixedSportsCar(Car, Vehicle): - - def __del__(self): - recycle(self.sports_car_parts) - Car.__del__(self) diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.qhelp b/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.qhelp deleted file mode 100644 index d9514b2c68c4..000000000000 --- a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.qhelp +++ /dev/null @@ -1,58 +0,0 @@ - - - - -

    Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object destruction. -However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. -Therefore the developer has responsibility for ensuring that objects are properly cleaned up when -there are multiple __del__ methods that need to be called. -

    - -

    -Calling a __del__ method more than once during object destruction risks resources being released multiple -times. The relevant __del__ method may not be designed to be called more than once. -

    - -

    There are a number of ways that a __del__ method may be be called more than once.

    -
      -
    • There may be more than one explicit call to the method in the hierarchy of __del__ methods.
    • -
    • A class using multiple inheritance directly calls the __del__ methods of its base types. - One or more of those base types uses super() to pass down the inheritance chain.
    • -
    - - -
    - -

    Either be careful not to explicitly call a __del__ method more than once, or -use super() throughout the inheritance hierarchy.

    - -

    Alternatively refactor one or more of the classes to use composition rather than inheritance.

    - -
    - -

    In the first example, explicit calls to __del__ are used, but SportsCar erroneously calls -both Vehicle.__del__ and Car.__del__. -This can be fixed by removing the call to Vehicle.__del__, as shown in FixedSportsCar. -

    - - - -

    In the second example, there is a mixture of explicit calls to __del__ and calls using super(). -To fix this example, super() should be used throughout. -

    - - - -
    - - -
  • Python Tutorial: Classes.
  • -
  • Python Standard Library: super.
  • -
  • Artima Developer: Things to Know About Python Super.
  • -
  • Wikipedia: Composition over inheritance.
  • - - -
    -
    diff --git a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql b/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql deleted file mode 100644 index 019da4257aa0..000000000000 --- a/python/ql/src/Classes/SuperclassDelCalledMultipleTimes.ql +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @name Multiple calls to `__del__` during object destruction - * @description A duplicated call to a super-class `__del__` method may lead to class instances not be cleaned up properly. - * @kind problem - * @tags quality - * reliability - * correctness - * @problem.severity warning - * @sub-severity high - * @precision very-high - * @id py/multiple-calls-to-delete - */ - -import python -import MethodCallOrder - -from ClassObject self, FunctionObject multi -where - multiple_calls_to_superclass_method(self, multi, "__del__") and - not multiple_calls_to_superclass_method(self.getABaseType(), multi, "__del__") and - not exists(FunctionObject better | - multiple_calls_to_superclass_method(self, better, "__del__") and - better.overrides(multi) - ) and - not self.failedInference() -select self, - "Class " + self.getName() + - " may not be cleaned up properly as $@ may be called multiple times during destruction.", multi, - multi.descriptiveString() diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.py b/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.py deleted file mode 100644 index 050d5d389d61..000000000000 --- a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.py +++ /dev/null @@ -1,36 +0,0 @@ -#Calling a method multiple times by using explicit calls when a base inherits from other base -class Vehicle(object): - - def __init__(self): - self.mobile = True - -class Car(Vehicle): - - def __init__(self): - Vehicle.__init__(self) - self.car_init() - - def car_init(self): - pass - -class SportsCar(Car, Vehicle): - - # Vehicle.__init__ will get called twice - def __init__(self): - Vehicle.__init__(self) - Car.__init__(self) - self.sports_car_init() - - def sports_car_init(self): - pass - -#Fix SportsCar by only calling Car.__init__ -class FixedSportsCar(Car, Vehicle): - - def __init__(self): - Car.__init__(self) - self.sports_car_init() - - def sports_car_init(self): - pass - diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.qhelp b/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.qhelp deleted file mode 100644 index f1140d68b891..000000000000 --- a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.qhelp +++ /dev/null @@ -1,58 +0,0 @@ - - - - -

    Python, unlike statically typed languages such as Java, allows complete freedom when calling methods during object initialization. -However, standard object-oriented principles apply to Python classes using deep inheritance hierarchies. -Therefore the developer has responsibility for ensuring that objects are properly initialized when -there are multiple __init__ methods that need to be called. -

    - -

    -Calling an __init__ method more than once during object initialization risks the object being incorrectly initialized. -It is unlikely that the relevant __init__ method is designed to be called more than once. -

    - -

    There are a number of ways that an __init__ method may be be called more than once.

    -
      -
    • There may be more than one explicit call to the method in the hierarchy of __init__ methods.
    • -
    • A class using multiple inheritance directly calls the __init__ methods of its base types. - One or more of those base types uses super() to pass down the inheritance chain.
    • -
    - - -
    - -

    Either be careful not to explicitly call an __init__ method more than once, or -use super() throughout the inheritance hierarchy.

    - -

    Alternatively refactor one or more of the classes to use composition rather than inheritance.

    - -
    - -

    In the first example, explicit calls to __init__ are used, but SportsCar erroneously calls -both Vehicle.__init__ and Car.__init__. -This can be fixed by removing the call to Vehicle.__init__, as shown in FixedSportsCar. -

    - - - -

    In the second example, there is a mixture of explicit calls to __init__ and calls using super(). -To fix this example, super() should be used throughout. -

    - - - -
    - - -
  • Python Tutorial: Classes.
  • -
  • Python Standard Library: super.
  • -
  • Artima Developer: Things to Know About Python Super.
  • -
  • Wikipedia: Composition over inheritance.
  • - - -
    -
    diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql b/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql deleted file mode 100644 index 6251ef274dac..000000000000 --- a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes.ql +++ /dev/null @@ -1,30 +0,0 @@ -/** - * @name Multiple calls to `__init__` during object initialization - * @description A duplicated call to a super-class `__init__` method may lead to objects of this class not being properly initialized. - * @kind problem - * @tags quality - * reliability - * correctness - * @problem.severity warning - * @sub-severity high - * @precision very-high - * @id py/multiple-calls-to-init - */ - -import python -import MethodCallOrder - -from ClassObject self, FunctionObject multi -where - multi != theObjectType().lookupAttribute("__init__") and - multiple_calls_to_superclass_method(self, multi, "__init__") and - not multiple_calls_to_superclass_method(self.getABaseType(), multi, "__init__") and - not exists(FunctionObject better | - multiple_calls_to_superclass_method(self, better, "__init__") and - better.overrides(multi) - ) and - not self.failedInference() -select self, - "Class " + self.getName() + - " may not be initialized properly as $@ may be called multiple times during initialization.", - multi, multi.descriptiveString() diff --git a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes2.py b/python/ql/src/Classes/SuperclassInitCalledMultipleTimes2.py deleted file mode 100644 index e12e86a079ee..000000000000 --- a/python/ql/src/Classes/SuperclassInitCalledMultipleTimes2.py +++ /dev/null @@ -1,38 +0,0 @@ - -#Calling a method multiple times by using explicit calls when a base uses super() -class Vehicle(object): - - def __init__(self): - super(Vehicle, self).__init__() - self.mobile = True - -class Car(Vehicle): - - def __init__(self): - super(Car, self).__init__() - self.car_init() - - def car_init(self): - pass - -class SportsCar(Car, Vehicle): - - # Vehicle.__init__ will get called twice - def __init__(self): - Vehicle.__init__(self) - Car.__init__(self) - self.sports_car_init() - - def sports_car_init(self): - pass - -#Fix SportsCar by using super() -class FixedSportsCar(Car, Vehicle): - - def __init__(self): - super(SportsCar, self).__init__() - self.sports_car_init() - - def sports_car_init(self): - pass - diff --git a/python/ql/src/Security/CWE-327/FluentApiModel.qll b/python/ql/src/Security/CWE-327/FluentApiModel.qll index 8dd90a588217..0f8dae7b3167 100644 --- a/python/ql/src/Security/CWE-327/FluentApiModel.qll +++ b/python/ql/src/Security/CWE-327/FluentApiModel.qll @@ -15,7 +15,7 @@ import TlsLibraryModel * The state is represented as a bit vector, where each bit corresponds to a * protocol version. The bit is set if the protocol is allowed. */ -module InsecureContextConfiguration implements DataFlow::StateConfigSig { +module InsecureContextConfig implements DataFlow::StateConfigSig { private newtype TFlowState = TMkFlowState(TlsLibrary library, int bits) { bits in [0 .. max(any(ProtocolVersion v).getBit()) * 2 - 1] @@ -116,7 +116,12 @@ module InsecureContextConfiguration implements DataFlow::StateConfigSig { } } -private module InsecureContextFlow = DataFlow::GlobalWithState; +/** + * DEPRECATED: Renamed to `InsecureContextConfig`. + */ +deprecated module InsecureContextConfiguration = InsecureContextConfig; + +private module InsecureContextFlow = DataFlow::GlobalWithState; /** * Holds if `conectionCreation` marks the creation of a connection based on the contex diff --git a/python/ql/src/change-notes/released/1.6.5.md b/python/ql/src/change-notes/released/1.6.5.md new file mode 100644 index 000000000000..e9e53221424d --- /dev/null +++ b/python/ql/src/change-notes/released/1.6.5.md @@ -0,0 +1,5 @@ +## 1.6.5 + +### Minor Analysis Improvements + +* The queries `py/missing-call-to-init`, `py/missing-calls-to-del`, `py/multiple-calls-to-init`, and `py/multiple-calls-to-del` queries have been modernized; no longer relying on outdated libraries, producing more precise results with more descriptive alert messages, and improved documentation. diff --git a/python/ql/src/codeql-pack.release.yml b/python/ql/src/codeql-pack.release.yml index 1910e09d6a6a..031532705578 100644 --- a/python/ql/src/codeql-pack.release.yml +++ b/python/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.6.4 +lastReleaseVersion: 1.6.5 diff --git a/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql b/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql index 1727da1bcf55..42c0bc170fd9 100755 --- a/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql +++ b/python/ql/src/experimental/Security/CWE-022bis/TarSlipImprov.ql @@ -63,7 +63,7 @@ private module TarSlipImprovConfig implements DataFlow::ConfigSig { // For a call to `file.extractall` without `members` argument, `file` is considered a sink. exists(MethodCallNode call, AllTarfileOpens atfo | call = atfo.getReturn().getMember("extractall").getACall() and - not exists(Node arg | arg = call.getArgByName("members")) and + not exists(call.getArgByName("members")) and sink = call.getObject() ) or diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 458b5f3eb8f2..ec238b337987 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.6.4 +version: 1.6.5 groups: - python - queries diff --git a/python/ql/test/library-tests/dataflow/global-flow/known.py b/python/ql/test/library-tests/dataflow/global-flow/known.py index ab60b9914524..f9bdbd7af54e 100644 --- a/python/ql/test/library-tests/dataflow/global-flow/known.py +++ b/python/ql/test/library-tests/dataflow/global-flow/known.py @@ -1 +1 @@ -known_attr = [1000] #$ writes=known_attr +known_attr = [1000] #$ writes=known_attr diff --git a/python/ql/test/library-tests/dataflow/typetracking/attribute_tests.py b/python/ql/test/library-tests/dataflow/typetracking/attribute_tests.py index 2cc6346527f6..8df3ef51f881 100644 --- a/python/ql/test/library-tests/dataflow/typetracking/attribute_tests.py +++ b/python/ql/test/library-tests/dataflow/typetracking/attribute_tests.py @@ -35,7 +35,7 @@ def set_foo(some_class_instance): # $ tracked=foo some_class_instance.foo = tracked # $ tracked=foo tracked def test_set_x(): - x = SomeClass() # $ MISSING: tracked=foo + x = SomeClass() # $ MISSING: tracked=foo set_foo(x) # $ MISSING: tracked=foo print(x.foo) # $ MISSING: tracked=foo tracked @@ -51,7 +51,7 @@ def test_create_with_foo(): def test_global_attribute_assignment(): global global_var - global_var.foo = tracked # $ tracked tracked=foo + global_var.foo = tracked # $ tracked tracked=foo def test_global_attribute_read(): x = global_var.foo # $ tracked tracked=foo @@ -61,7 +61,7 @@ def test_local_attribute_assignment(): # In this case, we don't want flow going to the `ModuleVariableNode` for `local_var` # (which is referenced in `test_local_attribute_read`). local_var = object() # $ tracked=foo - local_var.foo = tracked # $ tracked tracked=foo + local_var.foo = tracked # $ tracked tracked=foo def test_local_attribute_read(): x = local_var.foo @@ -129,7 +129,7 @@ def dunder_dict_indirect_write(): x = SomeClass() # $ MISSING: tracked=foo x.__dict__[attr] = tracked # $tracked MISSING: tracked=foo y = x.foo # $ MISSING: tracked tracked=foo - do_stuff(y) # $ MISSING: tracked + do_stuff(y) # $ MISSING: tracked def dunder_dict_indirect_read(): attr = "foo" @@ -153,7 +153,7 @@ def __init__(self): # $ tracked=foo def print_foo(self): # $ MISSING: tracked=foo print(self.foo) # $ MISSING: tracked=foo tracked - def possibly_uncalled_method(self): # $ MISSING: tracked=foo + def possibly_uncalled_method(self): # $ MISSING: tracked=foo print(self.foo) # $ MISSING: tracked=foo tracked instance = MyClass2() @@ -170,7 +170,7 @@ def print_self(self): # $ tracked=foo def print_foo(self): # $ tracked=foo print(self.foo) # $ tracked=foo tracked - def possibly_uncalled_method(self): # $ MISSING: tracked=foo + def possibly_uncalled_method(self): # $ MISSING: tracked=foo print(self.foo) # $ MISSING: tracked=foo tracked instance = MyClass3() # $ tracked=foo diff --git a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected index 7f080b1d729b..2ec5e1352584 100644 --- a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected +++ b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.expected @@ -1 +1 @@ -| missing_del.py:12:1:12:13 | class X3 | Class X3 may not be cleaned up properly as $@ is not called during deletion. | missing_del.py:9:5:9:22 | Function __del__ | method X2.__del__ | +| missing_del.py:13:1:13:13 | Class X3 | This class does not call $@ during finalization. ($@ may be missing a call to a base class __del__) | missing_del.py:9:5:9:22 | Function __del__ | X2.__del__ | missing_del.py:15:5:15:22 | Function __del__ | X3.__del__ | diff --git a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.qlref b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.qlref index 8bf1811d0fab..b7ff00870542 100644 --- a/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.qlref +++ b/python/ql/test/query-tests/Classes/missing-del/MissingCallToDel.qlref @@ -1 +1,2 @@ -Classes/MissingCallToDel.ql +query: Classes/CallsToInitDel/MissingCallToDel.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/missing-del/missing_del.py b/python/ql/test/query-tests/Classes/missing-del/missing_del.py index 5d4e30e681d2..6548bb1fa3b4 100644 --- a/python/ql/test/query-tests/Classes/missing-del/missing_del.py +++ b/python/ql/test/query-tests/Classes/missing-del/missing_del.py @@ -2,14 +2,19 @@ class X1(object): def __del__(self): - pass + print("X1 del") class X2(X1): def __del__(self): + print("X2 del") X1.__del__(self) -class X3(X2): +class X3(X2): # $ Alert - skips X2 del def __del__(self): + print("X3 del") X1.__del__(self) + +a = X3() +del a diff --git a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected index 6cb92041a630..c0f35be3ff9b 100644 --- a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected +++ b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.expected @@ -1,3 +1,6 @@ -| missing_init.py:12:1:12:13 | class B3 | Class B3 may not be initialized properly as $@ is not called from its $@. | missing_init.py:9:5:9:23 | Function __init__ | method B2.__init__ | missing_init.py:14:5:14:23 | Function __init__ | __init__ method | -| missing_init.py:39:1:39:21 | class IUVT | Class IUVT may not be initialized properly as $@ is not called from its $@. | missing_init.py:30:5:30:23 | Function __init__ | method UT.__init__ | missing_init.py:26:5:26:23 | Function __init__ | __init__ method | -| missing_init.py:72:1:72:13 | class AB | Class AB may not be initialized properly as $@ is not called from its $@. | missing_init.py:69:5:69:23 | Function __init__ | method AA.__init__ | missing_init.py:75:5:75:23 | Function __init__ | __init__ method | +| missing_init.py:13:1:13:13 | Class B3 | This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__) | missing_init.py:9:5:9:23 | Function __init__ | B2.__init__ | missing_init.py:14:5:14:23 | Function __init__ | B3.__init__ | +| missing_init.py:42:1:42:21 | Class IUVT | This class does not call $@ during initialization. (The class lacks an __init__ method to ensure every base class __init__ is called.) | missing_init.py:33:5:33:23 | Function __init__ | UT.__init__ | file://:0:0:0:0 | (none) | | +| missing_init.py:67:1:67:13 | Class AB | This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__) | missing_init.py:64:5:64:23 | Function __init__ | AA.__init__ | missing_init.py:70:5:70:23 | Function __init__ | AB.__init__ | +| missing_init.py:122:5:122:17 | Class DC | This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__) | missing_init.py:117:5:117:23 | Function __init__ | DA.__init__ | missing_init.py:124:9:124:27 | Function __init__ | DB.DC.__init__ | +| missing_init.py:132:1:132:13 | Class DD | This class does not call $@ during initialization. ($@ may be missing a call to a base class __init__) | missing_init.py:117:5:117:23 | Function __init__ | DA.__init__ | missing_init.py:134:5:134:23 | Function __init__ | DD.__init__ | +| missing_init.py:200:1:200:17 | Class H3 | This class does not call $@ during initialization. ($@ may be missing a call to super().__init__) | missing_init.py:197:5:197:23 | Function __init__ | H2.__init__ | missing_init.py:193:5:193:23 | Function __init__ | H1.__init__ | diff --git a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.qlref b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.qlref index b8635a5f8d92..86700427963a 100644 --- a/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.qlref +++ b/python/ql/test/query-tests/Classes/missing-init/MissingCallToInit.qlref @@ -1 +1,2 @@ -Classes/MissingCallToInit.ql +query: Classes/CallsToInitDel/MissingCallToInit.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/missing-init/missing_init.py b/python/ql/test/query-tests/Classes/missing-init/missing_init.py index b1651557759f..68498765f75f 100644 --- a/python/ql/test/query-tests/Classes/missing-init/missing_init.py +++ b/python/ql/test/query-tests/Classes/missing-init/missing_init.py @@ -2,18 +2,21 @@ class B1(object): def __init__(self): - do_something() + print("B1 init") class B2(B1): def __init__(self): + print("B2 init") B1.__init__(self) -class B3(B2): - - def __init__(self): +class B3(B2): # $ Alert + def __init__(self): + print("B3 init") B1.__init__(self) +B3() + #OK if superclass __init__ is builtin as #builtin classes tend to rely on __new__ class MyException(Exception): @@ -23,11 +26,11 @@ def __init__(self): #ODASA-4107 class IUT(object): - def __init__(self): + def __init__(self): print("IUT init") class UT(object): - def __init__(self): + def __init__(self): print("UT init") class PU(object): @@ -36,150 +39,167 @@ class PU(object): class UVT(UT, PU): pass -class IUVT(IUT, UVT): +class IUVT(IUT, UVT): # $ Alert pass -#False positive +print("IUVT") +IUVT() + class M1(object): def __init__(self): - print("A") + print("M1 init") class M2(object): pass class Mult(M2, M1): def __init__(self): - super(Mult, self).__init__() # Calls M1.__init__ + print("Mult init") + super(Mult, self).__init__() # OK - Calls M1.__init__ -class X: - def __init__(self): - do_something() - -class Y(X): - @decorated - def __init__(self): - X.__init__(self) - -class Z(Y): - def __init__(self): - Y.__init__(self) +Mult() class AA(object): def __init__(self): - do_something() + print("AA init") -class AB(AA): +class AB(AA): # $ Alert - #Don't call super class init - def __init__(self): - do_something() + # Doesn't call super class init + def __init__(self): + print("AB init") class AC(AB): def __init__(self): - #Missing call to AA.__init__ but not AC's fault. + # Doesn't call AA init, but we don't alert here as the issue is with AB. + print("AC init") super(AC, self).__init__() +AC() + import six import abc class BA(object): def __init__(self): - do_something() + print("BA init") @six.add_metaclass(abc.ABCMeta) class BB(BA): def __init__(self): + print("BB init") super(BB,self).__init__() +BB() + @six.add_metaclass(abc.ABCMeta) class CA(object): def __init__(self): - do_something() + print("CA init") -class CB(BA): +class CB(CA): def __init__(self): + print("CB init") super(CB,self).__init__() +CB() + #ODASA-5799 class DA(object): def __init__(self): - do_something() + print("DA init") class DB(DA): - class DC(DA): + class DC(DA): # $ SPURIOUS: Alert # We only consider direct super calls, so have an FP here - def __init__(self): + def __init__(self): + print("DC init") sup = super(DB.DC, self) sup.__init__() +DB.DC() + #Simpler variants -class DD(DA): +class DD(DA): # $ SPURIOUS: Alert # We only consider direct super calls, so have an FP here - def __init__(self): + def __init__(self): + print("DD init") sup = super(DD, self) sup.__init__() +DD() + class DE(DA): - class DF(DA): + class DF(DA): # No alert here - def __init__(self): + def __init__(self): + print("DF init") sup = super(DE.DF, self).__init__() +DE.DF() + class FA(object): def __init__(self): - pass + pass # does nothing, thus is considered a trivial method and ok to not call class FB(object): def __init__(self): - do_something() + print("FB init") class FC(FA, FB): def __init__(self): - #OK to skip call to FA.__init__ as that does nothing. + # No alert here - ok to skip call to trivial FA init FB.__init__(self) #Potential false positives. class ConfusingInit(B1): - def __init__(self): + def __init__(self): # We track this correctly and don't alert. super_call = super(ConfusingInit, self).__init__ super_call() -# Library class -import collections - -class G1(collections.Counter): - +class G1: def __init__(self): - collections.Counter.__init__(self) - -class G2(G1): + print("G1 init") +class G2: def __init__(self): - super(G2, self).__init__() + print("G2 init") -class G3(collections.Counter): +class G3(G1, G2): + def __init__(self): + print("G3 init") + for cls in self.__class__.__bases__: + cls.__init__(self) # We dont track which classes this could refer to, but assume it calls all required init methods and don't alert. - def __init__(self): - super(G3, self).__init__() +G3() -class G4(G3): +class H1: + def __init__(self): + print("H1 init") +class H2: def __init__(self): - G3.__init__(self) + print("H2 init") + +class H3(H1, H2): # $ Alert # The alert should also mention that H1.__init__ may be missing a call to super().__init__ + def __init__(self): + print("H3 init") + super().__init__() +H3() \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.expected deleted file mode 100644 index 210f24c7525d..000000000000 --- a/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.expected +++ /dev/null @@ -1,2 +0,0 @@ -| multiple_del.py:17:1:17:17 | class Y3 | Class Y3 may not be cleaned up properly as $@ may be called multiple times during destruction. | multiple_del.py:9:5:9:22 | Function __del__ | method Y1.__del__ | -| multiple_del.py:34:1:34:17 | class Z3 | Class Z3 may not be cleaned up properly as $@ may be called multiple times during destruction. | multiple_del.py:26:5:26:22 | Function __del__ | method Z1.__del__ | diff --git a/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.qlref b/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.qlref deleted file mode 100644 index 560d7b7dc416..000000000000 --- a/python/ql/test/query-tests/Classes/multiple/SuperclassDelCalledMultipleTimes.qlref +++ /dev/null @@ -1 +0,0 @@ -Classes/SuperclassDelCalledMultipleTimes.ql diff --git a/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.expected deleted file mode 100644 index 04ce8c0f3730..000000000000 --- a/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.expected +++ /dev/null @@ -1,2 +0,0 @@ -| multiple_init.py:17:1:17:17 | class C3 | Class C3 may not be initialized properly as $@ may be called multiple times during initialization. | multiple_init.py:9:5:9:23 | Function __init__ | method C1.__init__ | -| multiple_init.py:34:1:34:17 | class D3 | Class D3 may not be initialized properly as $@ may be called multiple times during initialization. | multiple_init.py:26:5:26:23 | Function __init__ | method D1.__init__ | diff --git a/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.qlref b/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.qlref deleted file mode 100644 index 042ddb76904c..000000000000 --- a/python/ql/test/query-tests/Classes/multiple/SuperclassInitCalledMultipleTimes.qlref +++ /dev/null @@ -1 +0,0 @@ -Classes/SuperclassInitCalledMultipleTimes.ql diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected new file mode 100644 index 000000000000..b7ee48feba78 --- /dev/null +++ b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.expected @@ -0,0 +1,2 @@ +| multiple_del.py:21:5:21:22 | Function __del__ | This finalization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | multiple_del.py:23:9:23:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:24:9:24:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:9:5:9:22 | Function __del__ | Y1.__del__ | multiple_del.py:15:5:15:22 | Function __del__ | Y2.__del__ | +| multiple_del.py:43:5:43:22 | Function __del__ | This finalization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | multiple_del.py:45:9:45:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:46:9:46:24 | ControlFlowNode for Attribute() | this call | multiple_del.py:32:5:32:22 | Function __del__ | Z1.__del__ | multiple_del.py:37:5:37:22 | Function __del__ | Z2.__del__ | diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.qlref b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.qlref new file mode 100644 index 000000000000..8fa7d25474b0 --- /dev/null +++ b/python/ql/test/query-tests/Classes/multiple/multiple-del/SuperclassDelCalledMultipleTimes.qlref @@ -0,0 +1,2 @@ +query: Classes/CallsToInitDel/SuperclassDelCalledMultipleTimes.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/multiple/multiple_del.py b/python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py similarity index 71% rename from python/ql/test/query-tests/Classes/multiple/multiple_del.py rename to python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py index 284f6bf6969f..f72e7c5d00ad 100644 --- a/python/ql/test/query-tests/Classes/multiple/multiple_del.py +++ b/python/ql/test/query-tests/Classes/multiple/multiple-del/multiple_del.py @@ -2,37 +2,48 @@ class Base(object): def __del__(self): - pass + print("Base del") class Y1(Base): def __del__(self): + print("Y1 del") super(Y1, self).__del__() class Y2(Base): def __del__(self): + print("Y2 del") super(Y2, self).__del__() #When `type(self) == Y3` this calls `Y1.__del__` class Y3(Y2, Y1): - def __del__(self): + def __del__(self): # $ Alert + print("Y3 del") Y1.__del__(self) Y2.__del__(self) +a = Y3() +del a + #Calling a method multiple times by using explicit calls when a base inherits from other base class Z1(object): def __del__(self): - pass + print("Z1 del") class Z2(Z1): def __del__(self): + print("Z2 del") Z1.__del__(self) class Z3(Z2, Z1): - def __del__(self): + def __del__(self): # $ Alert + print("Z3 del") Z1.__del__(self) Z2.__del__(self) + +b = Z3() +del b diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected new file mode 100644 index 000000000000..024d0c6425ab --- /dev/null +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.expected @@ -0,0 +1,4 @@ +| multiple_init.py:21:5:21:23 | Function __init__ | This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_init.py:9:5:9:23 | Function __init__ | C1.__init__ | multiple_init.py:23:9:23:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:24:9:24:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:9:5:9:23 | Function __init__ | C1.__init__ | multiple_init.py:15:5:15:23 | Function __init__ | C2.__init__ | +| multiple_init.py:42:5:42:23 | Function __init__ | This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_init.py:31:5:31:23 | Function __init__ | D1.__init__ | multiple_init.py:44:9:44:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:45:9:45:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:31:5:31:23 | Function __init__ | D1.__init__ | multiple_init.py:36:5:36:23 | Function __init__ | D2.__init__ | +| multiple_init.py:84:5:84:23 | Function __init__ | This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_init.py:80:5:80:23 | Function __init__ | F3.__init__ | multiple_init.py:86:9:86:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:87:9:87:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:75:5:75:23 | Function __init__ | F2.__init__ | multiple_init.py:80:5:80:23 | Function __init__ | F3.__init__ | +| multiple_init.py:111:5:111:23 | Function __init__ | This initialization method calls $@ multiple times, via $@ and $@, resolving to $@ and $@ respectively. | multiple_init.py:92:5:92:23 | Function __init__ | G1.__init__ | multiple_init.py:113:9:113:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:114:9:114:25 | ControlFlowNode for Attribute() | this call | multiple_init.py:96:5:96:23 | Function __init__ | G2.__init__ | multiple_init.py:101:5:101:23 | Function __init__ | G3.__init__ | diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.qlref b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.qlref new file mode 100644 index 000000000000..9a2b156acd35 --- /dev/null +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/SuperclassInitCalledMultipleTimes.qlref @@ -0,0 +1,2 @@ +query: Classes/CallsToInitDel/SuperclassInitCalledMultipleTimes.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py b/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py new file mode 100644 index 000000000000..faa0a71c6db3 --- /dev/null +++ b/python/ql/test/query-tests/Classes/multiple/multiple-init/multiple_init.py @@ -0,0 +1,117 @@ +#Calling a method multiple times by using explicit calls when a base uses super() +class Base(object): + + def __init__(self): + print("Base init") + +class C1(Base): + + def __init__(self): + print("C1 init") + super(C1, self).__init__() + +class C2(Base): + + def __init__(self): + print("C2 init") + super(C2, self).__init__() #When `type(self) == C3` this calls `C1.__init__` + +class C3(C2, C1): + + def __init__(self): # $ Alert + print("C3 init") + C1.__init__(self) + C2.__init__(self) + +C3() + +#Calling a method multiple times by using explicit calls when a base inherits from other base +class D1(object): + + def __init__(self): + print("D1 init") + +class D2(D1): + + def __init__(self): + print("D2 init") + D1.__init__(self) + +class D3(D2, D1): + + def __init__(self): # $ Alert + print("D3 init") + D1.__init__(self) + D2.__init__(self) + +D3() + +#OK to call object.__init__ multiple times +class E1(object): + + def __init__(self): + print("E1 init") + super(E1, self).__init__() + +class E2(object): + + def __init__(self): + print("E2 init") + object.__init__(self) + +class E3(E2, E1): + + def __init__(self): # OK: builtin init methods are fine. + E1.__init__(self) + E2.__init__(self) + +E3() + + +class F1: + pass + +class F2(F1): + def __init__(self): + print("F2 init") + super().__init__() + +class F3(F1): + def __init__(self): + print("F3 init") + +class F4(F2, F3): + def __init__(self): # $ Alert # F2's super call calls F3 + print("F4 init") + F2.__init__(self) + F3.__init__(self) + +F4() + +class G1: + def __init__(self): + print("G1 init") + +class G2(G1): + def __init__(self): + print("G2 init") + G1.__init__(self) + +class G3(G1): + def __init__(self): + print("G3 init") + G1.__init__(self) + +class G4(G1): + def __init__(self): + print("G4 init") + G1.__init__(self) + +class G5(G2,G3,G4): + def __init__(self): # $ Alert # Only one alert is generated, that mentions the first two calls + print("G5 init") + G2.__init__(self) + G3.__init__(self) + G4.__init__(self) + +G5() \ No newline at end of file diff --git a/python/ql/test/query-tests/Classes/multiple/multiple_init.py b/python/ql/test/query-tests/Classes/multiple/multiple_init.py deleted file mode 100644 index 6a97ef67f6ca..000000000000 --- a/python/ql/test/query-tests/Classes/multiple/multiple_init.py +++ /dev/null @@ -1,76 +0,0 @@ -#Calling a method multiple times by using explicit calls when a base uses super() -class Base(object): - - def __init__(self): - pass - -class C1(Base): - - def __init__(self): - super(C1, self).__init__() - -class C2(Base): - - def __init__(self): - super(C2, self).__init__() #When `type(self) == C3` this calls `C1.__init__` - -class C3(C2, C1): - - def __init__(self): - C1.__init__(self) - C2.__init__(self) - -#Calling a method multiple times by using explicit calls when a base inherits from other base -class D1(object): - - def __init__(self): - pass - -class D2(D1): - - def __init__(self): - D1.__init__(self) - -class D3(D2, D1): - - def __init__(self): - D1.__init__(self) - D2.__init__(self) - -#OK to call object.__init__ multiple times -class E1(object): - - def __init__(self): - super(E1, self).__init__() - -class E2(object): - - def __init__(self): - object.__init__(self) - -class E3(E2, E1): - - def __init__(self): - E1.__init__(self) - E2.__init__(self) - -#Two invocations, but can only be called once -class F1(Base): - - def __init__(self, cond): - if cond: - Base.__init__(self) - else: - Base.__init__(self) - -#Single call, splitting causes what seems to be multiple invocations. -class F2(Base): - - def __init__(self, cond): - if cond: - pass - if cond: - pass - Base.__init__(self) - - diff --git a/ruby/ql/consistency-queries/DataFlowConsistency.ql b/ruby/ql/consistency-queries/DataFlowConsistency.ql index 24766016cbb6..4e0588d5d4a1 100644 --- a/ruby/ql/consistency-queries/DataFlowConsistency.ql +++ b/ruby/ql/consistency-queries/DataFlowConsistency.ql @@ -28,7 +28,7 @@ private module Input implements InputSig { exists(CfgNodes::ExprCfgNode n | arg.argumentOf(call, _) and n = call.asCall() and - arg.asExpr().getASuccessor(any(SuccessorTypes::ConditionalSuccessor c)).getASuccessor*() = n and + arg.asExpr().getASuccessor(any(ConditionalSuccessor c)).getASuccessor*() = n and n.getASplit() instanceof Split::ConditionalCompletionSplit ) } diff --git a/ruby/ql/lib/CHANGELOG.md b/ruby/ql/lib/CHANGELOG.md index 560bf17bc51c..b9333de9c5dd 100644 --- a/ruby/ql/lib/CHANGELOG.md +++ b/ruby/ql/lib/CHANGELOG.md @@ -1,3 +1,7 @@ +## 5.0.4 + +No user-facing changes. + ## 5.0.3 No user-facing changes. diff --git a/ruby/ql/lib/change-notes/released/5.0.4.md b/ruby/ql/lib/change-notes/released/5.0.4.md new file mode 100644 index 000000000000..5c625c33d52f --- /dev/null +++ b/ruby/ql/lib/change-notes/released/5.0.4.md @@ -0,0 +1,3 @@ +## 5.0.4 + +No user-facing changes. diff --git a/ruby/ql/lib/codeql-pack.release.yml b/ruby/ql/lib/codeql-pack.release.yml index 6997554f6ddd..8cb0167caf0c 100644 --- a/ruby/ql/lib/codeql-pack.release.yml +++ b/ruby/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.0.3 +lastReleaseVersion: 5.0.4 diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll index bd13fca2875a..e085dbd90a38 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll @@ -8,7 +8,6 @@ private import codeql.ruby.ast.internal.TreeSitter private import codeql.ruby.controlflow.ControlFlowGraph private import internal.ControlFlowGraphImpl as CfgImpl private import CfgNodes -private import SuccessorTypes private import CfgImpl::BasicBlocks as BasicBlocksImpl private import codeql.controlflow.BasicBlock as BB @@ -302,13 +301,9 @@ private class BasicBlockAlias = BasicBlock; private class EntryBasicBlockAlias = EntryBasicBlock; -private class SuccessorTypeAlias = SuccessorType; - module Cfg implements BB::CfgSig { class ControlFlowNode = CfgNode; - class SuccessorType = SuccessorTypeAlias; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock = EntryBasicBlockAlias; diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 1d3632ba1c07..8a7abea30904 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -2,9 +2,9 @@ overlay[local] module; +import codeql.controlflow.SuccessorType private import codeql.ruby.AST private import codeql.ruby.controlflow.BasicBlocks -private import SuccessorTypes private import internal.ControlFlowGraphImpl as CfgImpl private import internal.Splitting as Splitting private import internal.Completion @@ -59,241 +59,6 @@ class CfgNode extends CfgImpl::Node { BasicBlock getBasicBlock() { result.getANode() = this } } -/** The type of a control flow successor. */ -class SuccessorType extends CfgImpl::TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { none() } -} - -/** Provides different types of control flow successor types. */ -module SuccessorTypes { - /** A normal control flow successor. */ - class NormalSuccessor extends SuccessorType, CfgImpl::TSuccessorSuccessor { - final override string toString() { result = "successor" } - } - - /** - * A conditional control flow successor. Either a Boolean successor (`BooleanSuccessor`) - * or a matching successor (`MatchingSuccessor`) - */ - class ConditionalSuccessor extends SuccessorType { - boolean value; - - ConditionalSuccessor() { - this = CfgImpl::TBooleanSuccessor(value) or - this = CfgImpl::TMatchingSuccessor(value) - } - - /** Gets the Boolean value of this successor. */ - final boolean getValue() { result = value } - - override string toString() { result = this.getValue().toString() } - } - - /** - * A Boolean control flow successor. - * - * For example, in - * - * ```rb - * if x >= 0 - * puts "positive" - * else - * puts "negative" - * end - * ``` - * - * `x >= 0` has both a `true` successor and a `false` successor. - */ - class BooleanSuccessor extends ConditionalSuccessor, CfgImpl::TBooleanSuccessor { } - - /** - * A matching control flow successor. - * - * For example, this program fragment: - * - * ```rb - * case x - * when 1 then puts "one" - * else puts "not one" - * end - * ``` - * - * has a control flow graph containing matching successors: - * - * ``` - * x - * | - * 1 - * / \ - * / \ - * / \ - * / \ - * match non-match - * | | - * puts "one" puts "not one" - * ``` - */ - class MatchingSuccessor extends ConditionalSuccessor, CfgImpl::TMatchingSuccessor { - override string toString() { if value = true then result = "match" else result = "no-match" } - } - - /** - * A `return` control flow successor. - * - * Example: - * - * ```rb - * def sum(x,y) - * return x + y - * end - * ``` - * - * The exit node of `sum` is a `return` successor of the `return x + y` - * statement. - */ - class ReturnSuccessor extends SuccessorType, CfgImpl::TReturnSuccessor { - final override string toString() { result = "return" } - } - - /** - * A `break` control flow successor. - * - * Example: - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * break - * end - * end - * puts "done" - * end - * ``` - * - * The node `puts "done"` is `break` successor of the node `break`. - */ - class BreakSuccessor extends SuccessorType, CfgImpl::TBreakSuccessor { - final override string toString() { result = "break" } - } - - /** - * A `next` control flow successor. - * - * Example: - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * next - * end - * end - * puts "done" - * end - * ``` - * - * The node `x >= 0` is `next` successor of the node `next`. - */ - class NextSuccessor extends SuccessorType, CfgImpl::TNextSuccessor { - final override string toString() { result = "next" } - } - - /** - * A `redo` control flow successor. - * - * Example: - * - * Example: - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * redo - * end - * end - * puts "done" - * end - * ``` - * - * The node `x -= 1` is `redo` successor of the node `redo`. - */ - class RedoSuccessor extends SuccessorType, CfgImpl::TRedoSuccessor { - final override string toString() { result = "redo" } - } - - /** - * A `retry` control flow successor. - * - * Example: - * - * Example: - * - * ```rb - * def m - * begin - * puts "Retry" - * raise - * rescue - * retry - * end - * end - * ``` - * - * The node `puts "Retry"` is `retry` successor of the node `retry`. - */ - class RetrySuccessor extends SuccessorType, CfgImpl::TRetrySuccessor { - final override string toString() { result = "retry" } - } - - /** - * An exceptional control flow successor. - * - * Example: - * - * ```rb - * def m x - * if x > 2 - * raise "x > 2" - * end - * puts "x <= 2" - * end - * ``` - * - * The exit node of `m` is an exceptional successor of the node - * `raise "x > 2"`. - */ - class RaiseSuccessor extends SuccessorType, CfgImpl::TRaiseSuccessor { - final override string toString() { result = "raise" } - } - - /** - * An exit control flow successor. - * - * Example: - * - * ```rb - * def m x - * if x > 2 - * exit 1 - * end - * puts "x <= 2" - * end - * ``` - * - * The exit node of `m` is an exit successor of the node - * `exit 1`. - */ - class ExitSuccessor extends SuccessorType, CfgImpl::TExitSuccessor { - final override string toString() { result = "exit" } - } -} - class Split = Splitting::Split; /** Provides different kinds of control flow graph splittings. */ diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll index b8edf83c20df..bcfe8f98d437 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll @@ -12,7 +12,6 @@ private import codeql.ruby.ast.internal.Control private import codeql.ruby.controlflow.ControlFlowGraph private import ControlFlowGraphImpl as CfgImpl private import NonReturning -private import SuccessorTypes private newtype TCompletion = TSimpleCompletion() or @@ -267,7 +266,7 @@ abstract private class NonNestedNormalCompletion extends NormalCompletion { } /** A simple (normal) completion. */ class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } override string toString() { result = "simple" } } @@ -377,7 +376,7 @@ class NextCompletion extends Completion { this = TNestedCompletion(_, TNextCompletion(), _) } - override NextSuccessor getAMatchingSuccessorType() { any() } + override ContinueSuccessor getAMatchingSuccessorType() { any() } override string toString() { // `NestedCompletion` defines `toString()` for the other case @@ -431,7 +430,7 @@ class RaiseCompletion extends Completion { this = TNestedCompletion(_, TRaiseCompletion(), _) } - override RaiseSuccessor getAMatchingSuccessorType() { any() } + override ExceptionSuccessor getAMatchingSuccessorType() { any() } override string toString() { // `NestedCompletion` defines `toString()` for the other case diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll index d0d418a839f6..f564633bb00f 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll @@ -46,23 +46,10 @@ private module CfgInput implements CfgShared::InputSig { scope.(Impl::CfgScopeImpl).exit(last, c) } - class SuccessorType = Cfg::SuccessorType; + private class SuccessorType = Cfg::SuccessorType; SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - predicate successorTypeIsSimple(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::NormalSuccessor - } - - predicate successorTypeIsCondition(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::ConditionalSuccessor - } - - predicate isAbnormalExitType(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::RaiseSuccessor or - t instanceof Cfg::SuccessorTypes::ExitSuccessor - } - private predicate id(Ruby::AstNode node1, Ruby::AstNode node2) { node1 = node2 } private predicate idOf(Ruby::AstNode node, int id) = equivalenceRelation(id/2)(node, id) @@ -1528,21 +1515,3 @@ CfgScope getCfgScope(AstNode n) { pragma[only_bind_into](result) = getCfgScopeImpl(n0) ) } - -cached -private module Cached { - cached - newtype TSuccessorType = - TSuccessorSuccessor() or - TBooleanSuccessor(boolean b) { b in [false, true] } or - TMatchingSuccessor(boolean isMatch) { isMatch in [false, true] } or - TReturnSuccessor() or - TBreakSuccessor() or - TNextSuccessor() or - TRedoSuccessor() or - TRetrySuccessor() or - TRaiseSuccessor() or // TODO: Add exception type? - TExitSuccessor() -} - -import Cached diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll index a60102e017c6..387fb03dc9a8 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll @@ -6,7 +6,7 @@ private import codeql.ruby.CFG /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ pragma[nomagic] predicate guardControlsBlock(CfgNodes::AstCfgNode guard, BasicBlock bb, boolean branch) { - exists(ConditionBlock conditionBlock, SuccessorTypes::ConditionalSuccessor s | + exists(ConditionBlock conditionBlock, ConditionalSuccessor s | guard = conditionBlock.getLastNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll index 146d5927479d..782315dc14ca 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll @@ -8,7 +8,6 @@ private import codeql.ruby.AST as Ast private import Completion as Comp private import Comp private import ControlFlowGraphImpl -private import SuccessorTypes private import codeql.ruby.controlflow.ControlFlowGraph cached @@ -132,7 +131,7 @@ module EnsureSplitting { then // If the entry into the `ensure` block completes with any normal completion, // it simply means normal execution after the `ensure` block - this instanceof NormalSuccessor + this instanceof DirectSuccessor else this = c.getAMatchingSuccessorType() } } @@ -195,7 +194,7 @@ module EnsureSplitting { int getNestLevel() { result = nestLevel } override string toString() { - if type instanceof NormalSuccessor + if type instanceof DirectSuccessor then result = "" else if nestLevel > 0 @@ -271,14 +270,14 @@ module EnsureSplitting { or not c instanceof NormalCompletion or - type instanceof NormalSuccessor + type instanceof DirectSuccessor ) else ( // `ensure` block can exit with inherited completion `c`, which must // match this split inherited = true and type = c.getAMatchingSuccessorType() and - not type instanceof NormalSuccessor + not type instanceof DirectSuccessor ) ) or @@ -308,7 +307,7 @@ module EnsureSplitting { exists(EnsureSplitImpl outer | outer.(EnsureSplit).getNestLevel() = super.getNestLevel() - 1 and outer.exit(pred, c, inherited) and - super.getType() instanceof NormalSuccessor and + super.getType() instanceof DirectSuccessor and inherited = true ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index fa977dd4ce87..d47fe485e5e5 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -153,7 +153,7 @@ module LocalFlow { exprTo = nodeTo.asExpr() and n.getReturningNode().getAstNode() instanceof BreakStmt and exprTo.getAstNode() instanceof Loop and - nodeTo.asExpr().getAPredecessor(any(SuccessorTypes::BreakSuccessor s)) = n.getReturningNode() + nodeTo.asExpr().getAPredecessor(any(BreakSuccessor s)) = n.getReturningNode() ) or nodeFrom.asExpr() = nodeTo.(ReturningStatementNode).getReturningNode().getReturnedValueNode() @@ -161,7 +161,7 @@ module LocalFlow { nodeTo.asExpr() = any(CfgNodes::ExprNodes::ForExprCfgNode for | exists(SuccessorType s | - not s instanceof SuccessorTypes::BreakSuccessor and + not s instanceof BreakSuccessor and exists(for.getAPredecessor(s)) ) and nodeFrom.asExpr() = for.getValue() @@ -2386,8 +2386,7 @@ module TypeInference { | m = resolveConstantReadAccess(pattern.getExpr()) and cb.getLastNode() = pattern and - cb.edgeDominates(read.getBasicBlock(), - any(SuccessorTypes::MatchingSuccessor match | match.getValue() = true)) and + cb.edgeDominates(read.getBasicBlock(), any(MatchingSuccessor match | match.getValue() = true)) and caseRead = def.getARead() and read = def.getARead() and case.getValue() = caseRead diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll index af5745f6fd3c..029d4c530601 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll @@ -487,7 +487,7 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu * from `bb1` to `bb2`. */ predicate hasValueBranchEdge(BasicBlock bb1, BasicBlock bb2, GuardValue branch) { - exists(Cfg::SuccessorTypes::ConditionalSuccessor s | + exists(Cfg::ConditionalSuccessor s | this.getBasicBlock() = bb1 and bb2 = bb1.getASuccessor(s) and s.getValue() = branch diff --git a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll index b86d7de457ee..4969da43be34 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/data/internal/ApiGraphModelsExtensions.qll @@ -4,7 +4,7 @@ /** * Holds if the value at `(type, path)` should be seen as a flow - * source of the given `kind`. + * source of the given `kind` and `madId` is the data extension row number. * * The kind `remote` represents a general remote flow source. */ @@ -14,13 +14,14 @@ extensible predicate sourceModel( /** * Holds if the value at `(type, path)` should be seen as a sink - * of the given `kind`. + * of the given `kind` and `madId` is the data extension row number. */ extensible predicate sinkModel(string type, string path, string kind, QlBuiltins::ExtensionId madId); /** * Holds if in calls to `(type, path)`, the value referred to by `input` - * can flow to the value referred to by `output`. + * can flow to the value referred to by `output` and `madId` is the data + * extension row number. * * `kind` should be either `value` or `taint`, for value-preserving or taint-preserving steps, * respectively. diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index 4e7bacb8e37a..a76c7d0b90af 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 5.0.3 +version: 5.0.4 groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/CHANGELOG.md b/ruby/ql/src/CHANGELOG.md index 29b4ff27bc09..40209ec84bde 100644 --- a/ruby/ql/src/CHANGELOG.md +++ b/ruby/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.5 + +No user-facing changes. + ## 1.4.4 No user-facing changes. diff --git a/ruby/ql/src/change-notes/released/1.4.5.md b/ruby/ql/src/change-notes/released/1.4.5.md new file mode 100644 index 000000000000..930163bb5ae1 --- /dev/null +++ b/ruby/ql/src/change-notes/released/1.4.5.md @@ -0,0 +1,3 @@ +## 1.4.5 + +No user-facing changes. diff --git a/ruby/ql/src/codeql-pack.release.yml b/ruby/ql/src/codeql-pack.release.yml index 1dfca6daa3b1..a74b6b08d860 100644 --- a/ruby/ql/src/codeql-pack.release.yml +++ b/ruby/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.4.4 +lastReleaseVersion: 1.4.5 diff --git a/ruby/ql/src/experimental/insecure-randomness/examples/InsecureRandomnessBad.rb b/ruby/ql/src/experimental/insecure-randomness/examples/InsecureRandomnessBad.rb index d4a94a8b18be..044d257096ac 100644 --- a/ruby/ql/src/experimental/insecure-randomness/examples/InsecureRandomnessBad.rb +++ b/ruby/ql/src/experimental/insecure-randomness/examples/InsecureRandomnessBad.rb @@ -1,6 +1,6 @@ def generate_password() chars = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a + ['!', '@', '#', '$', '%'] - # BAD: rand is not cryptographically secure + # BAD: rand is not cryptographically secure password = (1..10).collect { chars[rand(chars.size)] }.join end diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index c91bc756159d..cea6e01dce68 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.4.4 +version: 1.4.5 groups: - ruby - queries diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected index cafb6267eb9b..35b18b7132b0 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected @@ -6,10 +6,10 @@ dominates | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | +| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:6:8:13 | [ensure: raise] self | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | [ensure: raise] self | +| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:6:8:13 | [ensure: exception] self | +| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | [ensure: exception] self | | break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | self | | break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:1:1:11:3 | exit m1 | | break_ensure.rb:1:1:56:4 | enter break_ensure.rb | break_ensure.rb:1:1:56:4 | enter break_ensure.rb | @@ -22,22 +22,22 @@ dominates | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | +| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: raise] self | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | [ensure: raise] self | +| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: exception] self | +| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | [ensure: exception] self | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | self | | break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | | break_ensure.rb:4:7:4:11 | break | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:6:8:13 | [ensure: raise] self | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | -| break_ensure.rb:9:5:9:23 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | +| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | | break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:5:9:23 | self | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:1:25:3 | enter m2 | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:14:3:24:5 | while ... | @@ -46,11 +46,11 @@ dominates | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:3:24:5 | while ... | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:3:24:5 | while ... | @@ -59,11 +59,11 @@ dominates | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | @@ -72,42 +72,42 @@ dominates | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:10:20:10 | [ensure: raise] y | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:10 | [ensure: exception] y | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:21:9:21:20 | [ensure: raise] self | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | exit m3 | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | exit m3 (normal) | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: raise] y | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: raise] x | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: exception] x | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: return] break | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | break | | break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 | @@ -124,14 +124,14 @@ dominates | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:11:33:11 | [ensure: raise] y | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:12:35:12 | [ensure: raise] x | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:11:33:11 | [ensure: exception] y | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | @@ -142,19 +142,19 @@ dominates | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | +| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:12:35:12 | [ensure: raise] x | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:12:35:12 | [ensure: exception] x | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:12:35:12 | x | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:36:11:36:15 | [ensure: raise] break | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:36:11:36:15 | [ensure: return] break | | break_ensure.rb:36:11:36:15 | break | break_ensure.rb:36:11:36:15 | break | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:1:56:3 | enter m4 | @@ -163,41 +163,41 @@ dominates | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:3:55:5 | while ... | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:3:55:5 | while ... | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:9:45:9 | x | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | case.rb:1:1:6:3 | enter if_in_case | case.rb:1:1:6:3 | enter if_in_case | | case.rb:1:1:6:3 | enter if_in_case | case.rb:2:3:5:5 | case ... | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | @@ -2047,7 +2047,7 @@ dominates | raise.rb:68:1:77:3 | enter m7 | raise.rb:71:3:72:18 | elsif ... | | raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | | raise.rb:68:1:77:3 | enter m7 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: raise] self | +| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: exception] self | | raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | self | | raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | exit m7 | | raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | exit m7 (normal) | @@ -2060,7 +2060,7 @@ dominates | raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | | raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | self | | raise.rb:72:13:72:17 | x < 0 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:76:3:76:15 | [ensure: raise] self | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:3:76:15 | [ensure: exception] self | | raise.rb:76:3:76:15 | self | raise.rb:76:3:76:15 | self | | raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | enter m8 | | raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | exit m8 | @@ -2069,7 +2069,7 @@ dominates | raise.rb:79:1:92:3 | enter m8 | raise.rb:84:5:85:20 | elsif ... | | raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | | raise.rb:79:1:92:3 | enter m8 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: raise] self | +| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: exception] self | | raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | self | | raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | exit m8 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | exit m8 (normal) | @@ -2082,7 +2082,7 @@ dominates | raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | | raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | self | | raise.rb:85:15:85:19 | x < 0 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:89:5:89:17 | [ensure: raise] self | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:5:89:17 | [ensure: exception] self | | raise.rb:89:5:89:17 | self | raise.rb:89:5:89:17 | self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | enter m9 | | raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | exit m9 | @@ -2093,29 +2093,29 @@ dominates | raise.rb:94:1:119:3 | enter m9 | raise.rb:99:5:100:20 | elsif ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:99:11:99:11 | x | | raise.rb:94:1:119:3 | enter m9 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | [ensure: raise] self | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | [ensure: exception] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: raise] if ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: exception] if ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | b1 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: raise] self | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: exception] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | [ensure: raise] self | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | [ensure: exception] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: raise] if ... | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: exception] if ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: raise] self | +| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: exception] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: return] self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | self | | raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 | @@ -2127,21 +2127,21 @@ dominates | raise.rb:97:8:97:8 | x | raise.rb:99:5:100:20 | elsif ... | | raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | | raise.rb:97:8:97:8 | x | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: raise] self | +| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: exception] self | | raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | self | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: raise] if ... | +| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: exception] if ... | | raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | if ... | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | b1 | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: raise] self | +| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: exception] self | | raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | self | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | ensure ... | | raise.rb:97:8:97:8 | x | raise.rb:115:3:115:22 | self | @@ -2155,7 +2155,7 @@ dominates | raise.rb:99:5:100:20 | elsif ... | raise.rb:106:7:108:9 | if ... | | raise.rb:99:5:100:20 | elsif ... | raise.rb:106:10:106:11 | b1 | | raise.rb:99:5:100:20 | elsif ... | raise.rb:107:9:107:26 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | +| raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | ensure ... | | raise.rb:99:5:100:20 | elsif ... | raise.rb:115:3:115:22 | self | | raise.rb:99:5:100:20 | elsif ... | raise.rb:116:3:118:5 | if ... | @@ -2171,8 +2171,8 @@ dominates | raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | b1 | | raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | self | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | ensure ... | | raise.rb:99:11:99:11 | x | raise.rb:115:3:115:22 | self | @@ -2184,27 +2184,27 @@ dominates | raise.rb:100:15:100:19 | x < 0 | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:100:15:100:19 | x < 0 | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:100:15:100:19 | x < 0 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:100:15:100:19 | x < 0 | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:100:15:100:19 | x < 0 | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:104:5:104:23 | [ensure: raise] self | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:106:7:108:9 | [ensure: raise] if ... | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:106:10:106:11 | [ensure: raise] b1 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: raise] self | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: exception] if ... | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:106:10:106:11 | [ensure: exception] b1 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | raise.rb:104:5:104:23 | self | raise.rb:104:5:104:23 | self | | raise.rb:104:5:104:23 | self | raise.rb:106:7:108:9 | if ... | | raise.rb:104:5:104:23 | self | raise.rb:106:10:106:11 | b1 | | raise.rb:104:5:104:23 | self | raise.rb:107:9:107:26 | self | -| raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | +| raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | ensure ... | | raise.rb:104:5:104:23 | self | raise.rb:115:3:115:22 | self | | raise.rb:104:5:104:23 | self | raise.rb:116:3:118:5 | if ... | | raise.rb:104:5:104:23 | self | raise.rb:117:5:117:22 | self | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:106:7:108:9 | [ensure: raise] if ... | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | @@ -2214,36 +2214,36 @@ dominates | raise.rb:106:7:108:9 | if ... | raise.rb:115:3:115:22 | self | | raise.rb:106:7:108:9 | if ... | raise.rb:116:3:118:5 | if ... | | raise.rb:106:7:108:9 | if ... | raise.rb:117:5:117:22 | self | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:7:108:9 | [ensure: raise] if ... | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:10:106:11 | [ensure: raise] b1 | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:107:9:107:26 | [ensure: raise] self | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:10:106:11 | [ensure: exception] b1 | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:117:5:117:22 | [ensure: return] self | | raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | | raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | b1 | | raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | +| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | ensure ... | | raise.rb:106:10:106:11 | b1 | raise.rb:115:3:115:22 | self | | raise.rb:106:10:106:11 | b1 | raise.rb:116:3:118:5 | if ... | | raise.rb:106:10:106:11 | b1 | raise.rb:117:5:117:22 | self | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: raise] self | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | | raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:107:9:107:26 | self | raise.rb:107:9:107:26 | self | -| raise.rb:107:9:107:26 | self | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: raise] ensure ... | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:107:9:107:26 | self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | @@ -2251,16 +2251,16 @@ dominates | raise.rb:109:5:110:25 | ensure ... | raise.rb:115:3:115:22 | self | | raise.rb:109:5:110:25 | ensure ... | raise.rb:116:3:118:5 | if ... | | raise.rb:109:5:110:25 | ensure ... | raise.rb:117:5:117:22 | self | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:115:3:115:22 | [ensure: raise] self | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:116:3:118:5 | [ensure: raise] if ... | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | | raise.rb:115:3:115:22 | self | raise.rb:115:3:115:22 | self | | raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | | raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | -| raise.rb:116:3:118:5 | [ensure: raise] if ... | raise.rb:116:3:118:5 | [ensure: raise] if ... | +| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:116:3:118:5 | [ensure: exception] if ... | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | | raise.rb:116:3:118:5 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:117:5:117:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | +| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | | raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:5:117:22 | [ensure: return] self | | raise.rb:117:5:117:22 | self | raise.rb:117:5:117:22 | self | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | enter m10 | @@ -2277,7 +2277,7 @@ dominates | raise.rb:128:1:140:3 | enter m11 | raise.rb:133:3:133:19 | rescue ... | | raise.rb:128:1:140:3 | enter m11 | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:128:1:140:3 | enter m11 | raise.rb:135:5:135:21 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | self | | raise.rb:128:1:140:3 | exit m11 | raise.rb:128:1:140:3 | exit m11 | | raise.rb:130:5:132:7 | if ... | raise.rb:130:5:132:7 | if ... | @@ -2285,13 +2285,13 @@ dominates | raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | | raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:131:7:131:22 | self | raise.rb:135:5:135:21 | self | -| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:133:3:133:19 | rescue ... | raise.rb:133:3:133:19 | rescue ... | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:135:5:135:21 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | [ensure: raise] self | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:137:5:137:17 | self | raise.rb:137:5:137:17 | self | | raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | enter m12 | | raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | exit m12 (normal) | @@ -2362,7 +2362,7 @@ postDominance | break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:5:5:7 | if ... | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:4:7:4:11 | break | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:1:1:11:3 | enter m1 | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:9:2:9 | x | @@ -2371,8 +2371,8 @@ postDominance | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:4:7:4:11 | break | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:3:10:5 | if ... | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:6:8:13 | [ensure: raise] self | -| break_ensure.rb:9:5:9:23 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | +| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | | break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:5:9:23 | self | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:1:25:3 | enter m2 | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:13:1:25:3 | enter m2 | @@ -2382,11 +2382,11 @@ postDominance | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:9:14:9 | x | @@ -2399,15 +2399,15 @@ postDominance | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:21:9:21:20 | [ensure: raise] self | break_ensure.rb:21:9:21:20 | [ensure: raise] self | +| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:9:21:20 | [ensure: exception] self | | break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:9:21:20 | self | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 | @@ -2427,7 +2427,7 @@ postDominance | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:36:11:36:15 | break | | break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:29:5:31:7 | if ... | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:30:7:30:12 | return | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | @@ -2440,20 +2440,20 @@ postDominance | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:35:9:37:11 | if ... | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:35:12:35:12 | x | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:11:33:11 | [ensure: raise] y | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:11:33:11 | y | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | +| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | | break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:12:35:12 | [ensure: raise] x | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:12:35:12 | [ensure: exception] x | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:36:11:36:15 | [ensure: raise] break | break_ensure.rb:36:11:36:15 | [ensure: raise] break | +| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:36:11:36:15 | [ensure: exception] break | | break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:36:11:36:15 | [ensure: return] break | | break_ensure.rb:36:11:36:15 | break | break_ensure.rb:36:11:36:15 | break | | break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:1:56:3 | enter m4 | @@ -2463,23 +2463,23 @@ postDominance | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:9:45:9 | x | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | +| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | | break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:48:9:48:16 | self | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | +| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | | case.rb:1:1:6:3 | enter if_in_case | case.rb:1:1:6:3 | enter if_in_case | | case.rb:1:1:99:4 | enter case.rb | case.rb:1:1:99:4 | enter case.rb | | case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | enter if_in_case | @@ -3959,7 +3959,7 @@ postDominance | raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | enter m7 | | raise.rb:71:9:71:9 | x | raise.rb:71:9:71:9 | x | | raise.rb:72:13:72:17 | x < 0 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:76:3:76:15 | [ensure: raise] self | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:3:76:15 | [ensure: exception] self | | raise.rb:76:3:76:15 | self | raise.rb:71:3:72:18 | elsif ... | | raise.rb:76:3:76:15 | self | raise.rb:76:3:76:15 | self | | raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | enter m8 | @@ -3975,7 +3975,7 @@ postDominance | raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | enter m8 | | raise.rb:84:11:84:11 | x | raise.rb:84:11:84:11 | x | | raise.rb:85:15:85:19 | x < 0 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:89:5:89:17 | [ensure: raise] self | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:5:89:17 | [ensure: exception] self | | raise.rb:89:5:89:17 | self | raise.rb:84:5:85:20 | elsif ... | | raise.rb:89:5:89:17 | self | raise.rb:89:5:89:17 | self | | raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | enter m9 | @@ -4005,10 +4005,10 @@ postDominance | raise.rb:99:11:99:11 | x | raise.rb:97:8:97:8 | x | | raise.rb:99:11:99:11 | x | raise.rb:99:11:99:11 | x | | raise.rb:100:15:100:19 | x < 0 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:104:5:104:23 | [ensure: raise] self | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | | raise.rb:104:5:104:23 | self | raise.rb:99:5:100:20 | elsif ... | | raise.rb:104:5:104:23 | self | raise.rb:104:5:104:23 | self | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:106:7:108:9 | [ensure: raise] if ... | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:100:15:100:19 | x < 0 | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | @@ -4016,19 +4016,19 @@ postDominance | raise.rb:106:7:108:9 | if ... | raise.rb:104:5:104:23 | self | | raise.rb:106:7:108:9 | if ... | raise.rb:106:7:108:9 | if ... | | raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:100:15:100:19 | x < 0 | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:106:10:106:11 | b1 | raise.rb:99:5:100:20 | elsif ... | | raise.rb:106:10:106:11 | b1 | raise.rb:104:5:104:23 | self | | raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | b1 | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: raise] self | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | | raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:107:9:107:26 | self | raise.rb:107:9:107:26 | self | -| raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: raise] ensure ... | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | +| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | +| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:100:15:100:19 | x < 0 | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:10:106:11 | [ensure: return] b1 | @@ -4038,14 +4038,14 @@ postDominance | raise.rb:109:5:110:25 | ensure ... | raise.rb:106:7:108:9 | if ... | | raise.rb:109:5:110:25 | ensure ... | raise.rb:106:10:106:11 | b1 | | raise.rb:109:5:110:25 | ensure ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:115:3:115:22 | [ensure: raise] self | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | | raise.rb:115:3:115:22 | self | raise.rb:99:5:100:20 | elsif ... | | raise.rb:115:3:115:22 | self | raise.rb:104:5:104:23 | self | | raise.rb:115:3:115:22 | self | raise.rb:106:7:108:9 | if ... | | raise.rb:115:3:115:22 | self | raise.rb:106:10:106:11 | b1 | | raise.rb:115:3:115:22 | self | raise.rb:109:5:110:25 | ensure ... | | raise.rb:115:3:115:22 | self | raise.rb:115:3:115:22 | self | -| raise.rb:116:3:118:5 | [ensure: raise] if ... | raise.rb:116:3:118:5 | [ensure: raise] if ... | +| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:116:3:118:5 | [ensure: exception] if ... | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:100:15:100:19 | x < 0 | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | @@ -4058,7 +4058,7 @@ postDominance | raise.rb:116:3:118:5 | if ... | raise.rb:109:5:110:25 | ensure ... | | raise.rb:116:3:118:5 | if ... | raise.rb:115:3:115:22 | self | | raise.rb:116:3:118:5 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:117:5:117:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | +| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | | raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:5:117:22 | [ensure: return] self | | raise.rb:117:5:117:22 | self | raise.rb:117:5:117:22 | self | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | enter m10 | @@ -4074,7 +4074,7 @@ postDominance | raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:135:5:135:21 | self | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:135:5:135:21 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | [ensure: raise] self | raise.rb:137:5:137:17 | [ensure: raise] self | +| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:5:137:17 | [ensure: exception] self | | raise.rb:137:5:137:17 | self | raise.rb:128:1:140:3 | enter m11 | | raise.rb:137:5:137:17 | self | raise.rb:130:5:132:7 | if ... | | raise.rb:137:5:137:17 | self | raise.rb:131:7:131:22 | self | @@ -4131,10 +4131,10 @@ immediateDominator | break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:8:3:8 | x | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:9:2:9 | x | | break_ensure.rb:4:7:4:11 | break | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:8:6:8:13 | [ensure: raise] self | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:9:5:9:23 | [ensure: raise] self | break_ensure.rb:8:6:8:13 | [ensure: raise] self | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:2:9:2:9 | x | +| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | | break_ensure.rb:9:5:9:23 | self | break_ensure.rb:2:3:6:5 | while ... | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | @@ -4142,29 +4142,29 @@ immediateDominator | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:14:9:14:9 | x | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:16:10:16:10 | x | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:16:10:16:10 | x | | break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:21:9:21:20 | [ensure: raise] self | break_ensure.rb:20:10:20:10 | [ensure: raise] y | +| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:20:10:20:10 | [ensure: exception] y | | break_ensure.rb:21:9:21:20 | self | break_ensure.rb:16:7:18:9 | if ... | | break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:33:11:33:11 | [ensure: raise] y | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:27:1:42:3 | enter m3 | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:27:1:42:3 | enter m3 | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | break_ensure.rb:35:12:35:12 | [ensure: raise] x | +| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:12:35:12 | [ensure: exception] x | | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:33:11:33:11 | [ensure: raise] y | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:33:11:33:11 | [ensure: return] y | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:36:11:36:15 | [ensure: raise] break | break_ensure.rb:35:12:35:12 | [ensure: raise] x | +| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:35:12:35:12 | [ensure: exception] x | | break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:35:12:35:12 | [ensure: return] x | | break_ensure.rb:36:11:36:15 | break | break_ensure.rb:35:12:35:12 | x | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | @@ -4172,11 +4172,11 @@ immediateDominator | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:45:9:45:9 | x | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:47:10:47:10 | x | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:47:10:47:10 | x | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | break_ensure.rb:51:10:51:10 | [ensure: raise] x | +| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:51:10:51:10 | [ensure: exception] x | | case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | enter if_in_case | | case.rb:3:5:3:42 | [match] when ... | case.rb:1:1:6:3 | enter if_in_case | | case.rb:3:5:3:42 | [no-match] when ... | case.rb:1:1:6:3 | enter if_in_case | @@ -4470,7 +4470,7 @@ immediateDominator | raise.rb:71:3:72:18 | elsif ... | raise.rb:71:9:71:9 | x | | raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | enter m7 | | raise.rb:72:13:72:17 | x < 0 | raise.rb:71:9:71:9 | x | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:68:1:77:3 | enter m7 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:68:1:77:3 | enter m7 | | raise.rb:76:3:76:15 | self | raise.rb:71:3:72:18 | elsif ... | | raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | enter m8 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:84:11:84:11 | x | @@ -4478,7 +4478,7 @@ immediateDominator | raise.rb:84:5:85:20 | elsif ... | raise.rb:84:11:84:11 | x | | raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | enter m8 | | raise.rb:85:15:85:19 | x < 0 | raise.rb:84:11:84:11 | x | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:79:1:92:3 | enter m8 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:79:1:92:3 | enter m8 | | raise.rb:89:5:89:17 | self | raise.rb:84:5:85:20 | elsif ... | | raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | enter m9 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | enter m9 | @@ -4488,29 +4488,29 @@ immediateDominator | raise.rb:99:5:100:20 | elsif ... | raise.rb:99:11:99:11 | x | | raise.rb:99:11:99:11 | x | raise.rb:97:8:97:8 | x | | raise.rb:100:15:100:19 | x < 0 | raise.rb:99:11:99:11 | x | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:97:8:97:8 | x | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:97:8:97:8 | x | | raise.rb:104:5:104:23 | self | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:104:5:104:23 | [ensure: raise] self | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:104:5:104:23 | [ensure: exception] self | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:100:15:100:19 | x < 0 | | raise.rb:106:10:106:11 | b1 | raise.rb:104:5:104:23 | self | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:106:10:106:11 | [ensure: raise] b1 | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:106:10:106:11 | [ensure: exception] b1 | | raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:106:10:106:11 | [ensure: return] b1 | | raise.rb:107:9:107:26 | self | raise.rb:106:10:106:11 | b1 | -| raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | raise.rb:107:9:107:26 | self | -| raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | raise.rb:107:9:107:26 | [ensure: raise] self | -| raise.rb:109:5:110:25 | [ensure: raise] ensure ... | raise.rb:106:7:108:9 | [ensure: raise] if ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | raise.rb:107:9:107:26 | [ensure: return] self | +| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | self | +| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | [ensure: exception] self | +| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | +| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | [ensure: return] self | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:7:108:9 | [ensure: return] if ... | | raise.rb:109:5:110:25 | ensure ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:94:1:119:3 | enter m9 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:94:1:119:3 | enter m9 | | raise.rb:115:3:115:22 | self | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:116:3:118:5 | [ensure: raise] if ... | raise.rb:115:3:115:22 | [ensure: raise] self | +| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:115:3:115:22 | [ensure: exception] self | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:116:3:118:5 | if ... | raise.rb:115:3:115:22 | self | -| raise.rb:117:5:117:22 | [ensure: raise] self | raise.rb:115:3:115:22 | [ensure: raise] self | +| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | | raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | raise.rb:117:5:117:22 | self | raise.rb:115:3:115:22 | self | | raise.rb:121:1:126:3 | exit m10 | raise.rb:121:1:126:3 | enter m10 | @@ -4522,7 +4522,7 @@ immediateDominator | raise.rb:133:3:133:19 | rescue ... | raise.rb:131:7:131:22 | self | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:131:7:131:22 | self | | raise.rb:135:5:135:21 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:137:5:137:17 | [ensure: raise] self | raise.rb:134:10:134:19 | ExceptionB | +| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:134:10:134:19 | ExceptionB | | raise.rb:137:5:137:17 | self | raise.rb:128:1:140:3 | enter m11 | | raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | enter m12 | | raise.rb:143:3:145:5 | if ... | raise.rb:142:1:148:3 | enter m12 | @@ -4550,16 +4550,16 @@ controls | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:4:7:4:11 | break | true | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | false | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | true | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:7:18:9 | if ... | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:17:9:17:13 | break | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | true | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: raise] y | true | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: raise] self | true | +| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | true | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | true | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | false | @@ -4569,7 +4569,7 @@ controls | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | self | false | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:21:9:21:20 | [ensure: raise] self | true | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | false | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | true | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | true | @@ -4582,17 +4582,17 @@ controls | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | x | false | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | break | false | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | true | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:12:35:12 | [ensure: raise] x | true | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:36:11:36:15 | [ensure: raise] break | true | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | true | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | true | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | true | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | true | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:36:11:36:15 | [ensure: raise] break | true | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | false | @@ -4600,19 +4600,19 @@ controls | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:7:49:9 | if ... | true | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | true | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | true | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | true | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | true | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | true | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | true | +| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | false | | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | true | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | false | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | true | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | if ... | false | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | 10 | false | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | false | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | true | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | match | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | no-match | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:18:3:41 | if ... | match | @@ -5726,8 +5726,8 @@ controls | raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | b1 | false | | raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: return] self | false | | raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | false | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | false | +| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | false | | raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | false | | raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | ensure ... | false | | raise.rb:97:8:97:8 | x | raise.rb:115:3:115:22 | self | false | @@ -5744,8 +5744,8 @@ controls | raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | b1 | false | | raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | [ensure: return] self | true | | raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | true | +| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | false | +| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | true | | raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | true | | raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | ensure ... | false | | raise.rb:99:11:99:11 | x | raise.rb:115:3:115:22 | self | false | @@ -5753,27 +5753,27 @@ controls | raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | if ... | false | | raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | [ensure: return] self | true | | raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | self | false | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:7:108:9 | [ensure: raise] if ... | false | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:107:9:107:26 | [ensure: raise] self | true | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | true | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | false | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | true | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | true | +| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | true | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:116:3:118:5 | [ensure: return] if ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:117:5:117:22 | [ensure: return] self | false | | raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | true | +| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | true | | raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | ensure ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:115:3:115:22 | self | false | | raise.rb:106:10:106:11 | b1 | raise.rb:116:3:118:5 | if ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:117:5:117:22 | self | false | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | false | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:116:3:118:5 | [ensure: raise] if ... | false | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | true | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | true | | raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | false | | raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | true | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | false | @@ -5785,11 +5785,11 @@ controls | raise.rb:128:1:140:3 | enter m11 | raise.rb:133:3:133:19 | rescue ... | true | | raise.rb:128:1:140:3 | enter m11 | raise.rb:134:10:134:19 | ExceptionB | true | | raise.rb:128:1:140:3 | enter m11 | raise.rb:135:5:135:21 | self | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: raise] self | true | +| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: exception] self | true | | raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | match | | raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | no-match | | raise.rb:131:7:131:22 | self | raise.rb:135:5:135:21 | self | no-match | -| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: raise] self | no-match | +| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: exception] self | no-match | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | | raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | false | | raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | true | @@ -5810,34 +5810,34 @@ successor | break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:9:5:9:23 | self | true | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:3:6:5 | while ... | false | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: raise] self | raise | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:3:6:5 | while ... | raise | +| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: exception] self | exception | +| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:3:6:5 | while ... | exception | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | false | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | false | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:9:5:9:23 | [ensure: raise] self | true | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | false | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:3:24:5 | while ... | false | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | true | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | false | | break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | true | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | false | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: raise] y | raise | +| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | exception | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | false | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | false | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:21:9:21:20 | [ensure: raise] self | true | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | false | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | false | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: raise] y | raise | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | false | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:12:35:12 | [ensure: raise] x | true | +| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: exception] y | exception | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | false | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | false | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:5:39:7 | while ... | false | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:36:11:36:15 | [ensure: raise] break | true | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | false | @@ -5848,9 +5848,9 @@ successor | break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | true | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | false | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: raise] x | raise | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | false | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | true | +| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | match | | case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | no-match | | case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | match | @@ -5873,9 +5873,9 @@ successor | case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:17 | x | match | | case.rb:15:17:15:17 | x | case.rb:15:28:15:28 | 7 | false | | case.rb:15:17:15:17 | x | case.rb:16:10:16:10 | 8 | true | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | raise | +| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | exception | | case.rb:20:1:24:3 | enter case_match_no_match | case.rb:21:3:23:5 | case ... | match | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | raise | +| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | exception | | case.rb:26:1:30:3 | enter case_match_raise | case.rb:27:3:29:5 | case ... | match | | case.rb:32:1:39:3 | enter case_match_array | case.rb:33:3:38:5 | case ... | match | | case.rb:32:1:39:3 | enter case_match_array | case.rb:35:5:35:11 | in ... then ... | no-match | @@ -5889,9 +5889,9 @@ successor | case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | true | | case.rb:36:5:36:13 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | no-match | | case.rb:36:9:36:9 | x | case.rb:33:3:38:5 | case ... | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | raise | +| case.rb:37:5:37:27 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | | case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | raise | +| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | | case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false | | case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | match | | case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | true | @@ -5899,13 +5899,13 @@ successor | case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | | case.rb:37:19:37:19 | c | case.rb:37:25:37:25 | e | match | | case.rb:37:25:37:25 | e | case.rb:33:3:38:5 | case ... | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | false | | case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | match | | case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | true | -| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:10:43:10 | x | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | | case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:8:49:34 | { ..., ** } | match | | case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:5:50:25 | in ... then ... | no-match | @@ -5924,9 +5924,9 @@ successor | case.rb:50:8:50:24 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | no-match | | case.rb:50:16:50:16 | 1 | case.rb:48:3:52:5 | case ... | match | | case.rb:50:16:50:16 | 1 | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:51:5:51:17 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | raise | +| case.rb:51:5:51:17 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | | case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | raise | +| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | | case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | false | | case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | match | | case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | true | @@ -5997,12 +5997,12 @@ successor | case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | | case.rb:91:18:91:19 | [ ..., * ] | case.rb:72:3:92:5 | case ... | match | | case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | raise | +| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | exception | | case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | false | | case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | match | | case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | true | | case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:13:97:13 | x | match | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | raise | +| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | exception | | case.rb:97:13:97:13 | x | case.rb:97:25:97:25 | 6 | true | | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:19:19:19:32 | self | true | | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:21:19:21:32 | self | false | @@ -6158,7 +6158,7 @@ successor | raise.rb:7:1:12:3 | enter m1 | raise.rb:9:5:9:17 | self | true | | raise.rb:14:1:23:3 | enter m2 | raise.rb:16:5:18:7 | if ... | false | | raise.rb:14:1:23:3 | enter m2 | raise.rb:17:7:17:22 | self | true | -| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | exit m2 (abnormal) | raise | +| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | exit m2 (abnormal) | exception | | raise.rb:17:7:17:22 | self | raise.rb:20:5:20:18 | self | match | | raise.rb:25:1:34:3 | enter m3 | raise.rb:27:5:29:7 | if ... | false | | raise.rb:25:1:34:3 | enter m3 | raise.rb:28:7:28:22 | self | true | @@ -6170,36 +6170,36 @@ successor | raise.rb:57:1:66:3 | enter m6 | raise.rb:60:7:60:22 | self | true | | raise.rb:60:7:60:22 | self | raise.rb:62:22:62:31 | ExceptionB | no-match | | raise.rb:60:7:60:22 | self | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | raise | +| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | exception | | raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:36:62:36 | e | match | | raise.rb:68:1:77:3 | enter m7 | raise.rb:70:5:70:17 | self | true | | raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:71:9:71:9 | x | raise.rb:71:3:72:18 | elsif ... | false | | raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:79:1:92:3 | enter m8 | raise.rb:83:7:83:19 | self | true | | raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:84:11:84:11 | x | raise.rb:84:5:85:20 | elsif ... | false | | raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:97:8:97:8 | x | raise.rb:98:7:98:19 | self | true | | raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:99:11:99:11 | x | raise.rb:99:5:100:20 | elsif ... | false | | raise.rb:99:11:99:11 | x | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | [ensure: raise] self | raise | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:7:108:9 | [ensure: raise] if ... | false | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:107:9:107:26 | [ensure: raise] self | true | +| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | [ensure: exception] self | exception | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | | raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | false | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:116:3:118:5 | [ensure: raise] if ... | false | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:117:5:117:22 | [ensure: raise] self | true | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | true | | raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | false | | raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | true | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | false | @@ -6211,7 +6211,7 @@ successor | raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | match | | raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | no-match | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: raise] self | raise | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | exception | | raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | false | | raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | true | | raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:32 | self | true | @@ -6221,60 +6221,60 @@ successor | raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | | raise.rb:172:1:182:3 | enter m16 | raise.rb:174:14:174:15 | b2 | false | | raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | | raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:14:174:15 | b2 | raise.rb:179:10:179:19 | ExceptionA | raise | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | raise | +| raise.rb:174:14:174:15 | b2 | raise.rb:179:10:179:19 | ExceptionA | exception | +| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | exception | | raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | joinBlockPredecessor -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | 1 | +| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | 1 | | break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | if ... | 0 | | break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:9:2:9 | x | 0 | | break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:3:8:3:8 | x | 1 | | break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:4:7:4:11 | break | 2 | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | enter m1 | 0 | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | 1 | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:8:6:8:13 | [ensure: raise] self | 0 | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:9:5:9:23 | [ensure: raise] self | 1 | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | 0 | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:9:5:9:23 | [ensure: exception] self | 1 | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | 0 | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:9:5:9:23 | self | 1 | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | 0 | | break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | 1 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | 2 | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | 2 | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | 0 | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | 1 | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | 0 | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | 1 | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | 0 | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:21:9:21:20 | [ensure: raise] self | 1 | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | 0 | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | 1 | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | 0 | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:21:9:21:20 | self | 1 | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | 0 | +| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | 0 | | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | 1 | | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | while ... | 0 | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:33:11:33:11 | [ensure: raise] y | 0 | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:36:11:36:15 | [ensure: raise] break | 1 | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | 0 | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:36:11:36:15 | [ensure: exception] break | 1 | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | 0 | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | 1 | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | 0 | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:36:11:36:15 | break | 1 | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:27:1:42:3 | enter m3 | 0 | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | 1 | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:27:1:42:3 | enter m3 | 0 | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | 1 | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | 0 | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | 1 | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | 0 | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | 1 | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | 0 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | 1 | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | 1 | | break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | 10 | 2 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | 3 | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | 3 | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | 0 | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | 1 | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:47:10:47:10 | x | 0 | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:48:9:48:16 | self | 1 | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:47:10:47:10 | x | 0 | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:48:9:48:16 | self | 1 | | case.rb:2:3:5:5 | case ... | case.rb:3:18:3:41 | if ... | 0 | | case.rb:2:3:5:5 | case ... | case.rb:4:5:4:24 | [no-match] when ... | 1 | | case.rb:2:3:5:5 | case ... | case.rb:4:17:4:24 | self | 2 | @@ -6468,48 +6468,48 @@ joinBlockPredecessor | raise.rb:62:36:62:36 | e | raise.rb:62:22:62:31 | ExceptionB | 1 | | raise.rb:65:3:65:15 | self | raise.rb:59:5:61:7 | if ... | 0 | | raise.rb:65:3:65:15 | self | raise.rb:62:36:62:36 | e | 1 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:76:3:76:15 | [ensure: raise] self | 0 | +| raise.rb:68:1:77:3 | exit m7 | raise.rb:76:3:76:15 | [ensure: exception] self | 0 | | raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:72:13:72:17 | x < 0 | 0 | | raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:76:3:76:15 | self | 1 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:68:1:77:3 | enter m7 | 0 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:70:5:70:17 | self | 1 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:71:3:72:18 | elsif ... | 2 | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:71:9:71:9 | x | 3 | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:89:5:89:17 | [ensure: raise] self | 0 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:68:1:77:3 | enter m7 | 0 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:70:5:70:17 | self | 1 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:71:3:72:18 | elsif ... | 2 | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:71:9:71:9 | x | 3 | +| raise.rb:79:1:92:3 | exit m8 | raise.rb:89:5:89:17 | [ensure: exception] self | 0 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:85:15:85:19 | x < 0 | 0 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:89:5:89:17 | self | 1 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:79:1:92:3 | enter m8 | 0 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:83:7:83:19 | self | 1 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:84:5:85:20 | elsif ... | 2 | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:84:11:84:11 | x | 3 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:116:3:118:5 | [ensure: raise] if ... | 0 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: raise] self | 2 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:79:1:92:3 | enter m8 | 0 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:83:7:83:19 | self | 1 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:84:5:85:20 | elsif ... | 2 | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:84:11:84:11 | x | 3 | +| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:116:3:118:5 | [ensure: exception] if ... | 0 | +| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: exception] self | 2 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: return] self | 3 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | self | 1 | | raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | [ensure: return] if ... | 1 | | raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | if ... | 0 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:97:8:97:8 | x | 0 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:98:7:98:19 | self | 1 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:99:5:100:20 | elsif ... | 2 | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:99:11:99:11 | x | 3 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:94:1:119:3 | enter m9 | 0 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:100:15:100:19 | x < 0 | 1 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:104:5:104:23 | [ensure: raise] self | 3 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:104:5:104:23 | self | 2 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:106:7:108:9 | [ensure: raise] if ... | 5 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:106:7:108:9 | [ensure: return] if ... | 6 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:106:7:108:9 | if ... | 4 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: raise] self | 8 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:107:9:107:26 | [ensure: return] self | 9 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:107:9:107:26 | self | 7 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | 11 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | 13 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | 12 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | 14 | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:109:5:110:25 | ensure ... | 10 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:97:8:97:8 | x | 0 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:98:7:98:19 | self | 1 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:99:5:100:20 | elsif ... | 2 | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:99:11:99:11 | x | 3 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:94:1:119:3 | enter m9 | 0 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:100:15:100:19 | x < 0 | 1 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | 3 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:104:5:104:23 | self | 2 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: exception] if ... | 5 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: return] if ... | 6 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | if ... | 4 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | 8 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: return] self | 9 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | self | 7 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | 11 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | 13 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | 12 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | 14 | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | ensure ... | 10 | | raise.rb:121:1:126:3 | exit m10 | raise.rb:121:14:121:30 | self | 0 | | raise.rb:121:1:126:3 | exit m10 | raise.rb:125:3:125:51 | self | 1 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | [ensure: raise] self | 1 | +| raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | [ensure: exception] self | 1 | | raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | self | 0 | | raise.rb:137:5:137:17 | self | raise.rb:130:5:132:7 | if ... | 0 | | raise.rb:137:5:137:17 | self | raise.rb:133:3:133:19 | rescue ... | 1 | diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql index 8db21dd44964..c99de9bc0a86 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql @@ -9,7 +9,7 @@ query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) { bb1.getImmediateDominator() = bb2 } -query predicate controls(ConditionBlock bb1, BasicBlock bb2, SuccessorTypes::ConditionalSuccessor t) { +query predicate controls(ConditionBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.edgeDominates(bb2, t) } diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected b/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected index 243e107906ab..583ca5d46a80 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -9,37 +9,37 @@ | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:13:2:13 | 0 | | | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:3:6:5 | while ... | false | | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:8:6:8:13 | [ensure: raise] self | raise | +| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | exception | | break_ensure.rb:2:13:2:13 | 0 | break_ensure.rb:2:9:2:13 | ... < ... | | | break_ensure.rb:2:14:6:5 | do ... | break_ensure.rb:2:9:2:9 | x | | | break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:2:14:6:5 | do ... | | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:12:3:12 | 0 | | -| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:2:3:6:5 | while ... | raise | +| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:2:3:6:5 | while ... | exception | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:5:5:7 | if ... | false | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:4:7:4:11 | break | true | | break_ensure.rb:3:12:3:12 | 0 | break_ensure.rb:3:8:3:12 | ... > ... | | | break_ensure.rb:4:7:4:11 | break | break_ensure.rb:2:3:6:5 | while ... | break | -| break_ensure.rb:7:1:10:5 | [ensure: raise] ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (abnormal) | raise | +| break_ensure.rb:7:1:10:5 | [ensure: exception] ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (abnormal) | exception | | break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (normal) | | -| break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | break_ensure.rb:7:1:10:5 | [ensure: raise] ensure ... | | +| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:7:1:10:5 | [ensure: exception] ensure ... | | | break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:7:1:10:5 | ensure ... | | -| break_ensure.rb:8:6:8:13 | [ensure: raise] call to elements | break_ensure.rb:8:6:8:18 | [ensure: raise] call to nil? | | -| break_ensure.rb:8:6:8:13 | [ensure: raise] self | break_ensure.rb:8:6:8:13 | [ensure: raise] call to elements | | +| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | +| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | | break_ensure.rb:8:6:8:13 | call to elements | break_ensure.rb:8:6:8:18 | call to nil? | | | break_ensure.rb:8:6:8:13 | self | break_ensure.rb:8:6:8:13 | call to elements | | -| break_ensure.rb:8:6:8:18 | [ensure: raise] call to nil? | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | false | -| break_ensure.rb:8:6:8:18 | [ensure: raise] call to nil? | break_ensure.rb:9:5:9:23 | [ensure: raise] self | true | +| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | false | +| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | | break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:8:3:10:5 | if ... | false | | break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:9:5:9:23 | self | true | -| break_ensure.rb:8:20:9:23 | [ensure: raise] then ... | break_ensure.rb:8:3:10:5 | [ensure: raise] if ... | | +| break_ensure.rb:8:20:9:23 | [ensure: exception] then ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | | break_ensure.rb:8:20:9:23 | then ... | break_ensure.rb:8:3:10:5 | if ... | | -| break_ensure.rb:9:5:9:23 | [ensure: raise] call to puts | break_ensure.rb:8:20:9:23 | [ensure: raise] then ... | | -| break_ensure.rb:9:5:9:23 | [ensure: raise] self | break_ensure.rb:9:11:9:22 | [ensure: raise] elements nil | | +| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:8:20:9:23 | [ensure: exception] then ... | | +| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:11:9:22 | [ensure: exception] elements nil | | | break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:8:20:9:23 | then ... | | | break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:11:9:22 | elements nil | | | break_ensure.rb:9:10:9:23 | "elements nil" | break_ensure.rb:9:5:9:23 | call to puts | | -| break_ensure.rb:9:10:9:23 | [ensure: raise] "elements nil" | break_ensure.rb:9:5:9:23 | [ensure: raise] call to puts | | -| break_ensure.rb:9:11:9:22 | [ensure: raise] elements nil | break_ensure.rb:9:10:9:23 | [ensure: raise] "elements nil" | | +| break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | | +| break_ensure.rb:9:11:9:22 | [ensure: exception] elements nil | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | | break_ensure.rb:9:11:9:22 | elements nil | break_ensure.rb:9:10:9:23 | "elements nil" | | | break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:8:13:8 | x | | | break_ensure.rb:13:1:25:3 | exit m2 (normal) | break_ensure.rb:13:1:25:3 | exit m2 | | @@ -56,38 +56,38 @@ | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:14:16:14 | 0 | | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:7:18:9 | if ... | false | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:20:10:20:10 | [ensure: raise] y | raise | +| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | exception | | break_ensure.rb:16:14:16:14 | 0 | break_ensure.rb:16:10:16:14 | ... > ... | | | break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:10:20:10 | [ensure: break] y | break | | break_ensure.rb:19:5:22:9 | [ensure: break] ensure ... | break_ensure.rb:14:3:24:5 | while ... | break | -| break_ensure.rb:19:5:22:9 | [ensure: raise] ensure ... | break_ensure.rb:14:3:24:5 | while ... | raise | +| break_ensure.rb:19:5:22:9 | [ensure: exception] ensure ... | break_ensure.rb:14:3:24:5 | while ... | exception | | break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:14:14:24:5 | do ... | | | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:19:5:22:9 | [ensure: break] ensure ... | | -| break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | break_ensure.rb:19:5:22:9 | [ensure: raise] ensure ... | | +| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:19:5:22:9 | [ensure: exception] ensure ... | | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:19:5:22:9 | ensure ... | | | break_ensure.rb:20:10:20:10 | [ensure: break] y | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | | -| break_ensure.rb:20:10:20:10 | [ensure: raise] y | break_ensure.rb:20:10:20:15 | [ensure: raise] call to nil? | | +| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | | break_ensure.rb:20:10:20:10 | y | break_ensure.rb:20:10:20:15 | call to nil? | | | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | false | | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:15 | [ensure: raise] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | false | -| break_ensure.rb:20:10:20:15 | [ensure: raise] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: raise] self | true | +| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | false | +| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | | break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:20:7:22:9 | if ... | false | | break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:21:9:21:20 | self | true | | break_ensure.rb:20:17:21:20 | [ensure: break] then ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | | -| break_ensure.rb:20:17:21:20 | [ensure: raise] then ... | break_ensure.rb:20:7:22:9 | [ensure: raise] if ... | | +| break_ensure.rb:20:17:21:20 | [ensure: exception] then ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | | break_ensure.rb:20:17:21:20 | then ... | break_ensure.rb:20:7:22:9 | if ... | | | break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:20:17:21:20 | [ensure: break] then ... | | | break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:15:21:19 | [ensure: break] y nil | | -| break_ensure.rb:21:9:21:20 | [ensure: raise] call to puts | break_ensure.rb:20:17:21:20 | [ensure: raise] then ... | | -| break_ensure.rb:21:9:21:20 | [ensure: raise] self | break_ensure.rb:21:15:21:19 | [ensure: raise] y nil | | +| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:20:17:21:20 | [ensure: exception] then ... | | +| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:15:21:19 | [ensure: exception] y nil | | | break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:20:17:21:20 | then ... | | | break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:15:21:19 | y nil | | | break_ensure.rb:21:14:21:20 | "y nil" | break_ensure.rb:21:9:21:20 | call to puts | | | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | | -| break_ensure.rb:21:14:21:20 | [ensure: raise] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: raise] call to puts | | +| break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | | | break_ensure.rb:21:15:21:19 | [ensure: break] y nil | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | | -| break_ensure.rb:21:15:21:19 | [ensure: raise] y nil | break_ensure.rb:21:14:21:20 | [ensure: raise] "y nil" | | +| break_ensure.rb:21:15:21:19 | [ensure: exception] y nil | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | | break_ensure.rb:21:15:21:19 | y nil | break_ensure.rb:21:14:21:20 | "y nil" | | | break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:8:27:8 | x | | | break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | break_ensure.rb:27:1:42:3 | exit m3 | | @@ -99,45 +99,45 @@ | break_ensure.rb:29:8:29:8 | x | break_ensure.rb:29:8:29:13 | call to nil? | | | break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:29:5:31:7 | if ... | false | | break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:33:11:33:11 | [ensure: raise] y | raise | +| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:33:11:33:11 | [ensure: exception] y | exception | | break_ensure.rb:30:7:30:12 | return | break_ensure.rb:33:11:33:11 | [ensure: return] y | return | -| break_ensure.rb:32:3:39:7 | [ensure: raise] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | raise | +| break_ensure.rb:32:3:39:7 | [ensure: exception] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | exception | | break_ensure.rb:32:3:39:7 | [ensure: return] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (normal) | return | | break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:41:3:41:13 | self | | -| break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break_ensure.rb:32:3:39:7 | [ensure: raise] ensure ... | | +| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:32:3:39:7 | [ensure: exception] ensure ... | | | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:32:3:39:7 | [ensure: return] ensure ... | | | break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:32:3:39:7 | ensure ... | | -| break_ensure.rb:33:11:33:11 | [ensure: raise] y | break_ensure.rb:33:15:33:15 | [ensure: raise] 0 | | +| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | | | break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:15:33:15 | 0 | | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:5:39:7 | while ... | false | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:33:11:33:15 | [ensure: raise] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | false | -| break_ensure.rb:33:11:33:15 | [ensure: raise] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: raise] x | true | +| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | false | +| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | false | | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | | break_ensure.rb:33:15:33:15 | 0 | break_ensure.rb:33:11:33:15 | ... < ... | | -| break_ensure.rb:33:15:33:15 | [ensure: raise] 0 | break_ensure.rb:33:11:33:15 | [ensure: raise] ... < ... | | +| break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | | | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | | -| break_ensure.rb:33:16:39:7 | [ensure: raise] do ... | break_ensure.rb:33:11:33:11 | [ensure: raise] y | | +| break_ensure.rb:33:16:39:7 | [ensure: exception] do ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | | break_ensure.rb:33:16:39:7 | [ensure: return] do ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | | | break_ensure.rb:33:16:39:7 | do ... | break_ensure.rb:33:11:33:11 | y | | -| break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | break_ensure.rb:33:16:39:7 | [ensure: raise] do ... | | +| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:33:16:39:7 | [ensure: exception] do ... | | | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:33:16:39:7 | [ensure: return] do ... | | | break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:33:16:39:7 | do ... | | -| break_ensure.rb:35:12:35:12 | [ensure: raise] x | break_ensure.rb:35:16:35:16 | [ensure: raise] 0 | | +| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | | | break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:16:35:16 | 0 | | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:9:37:11 | if ... | false | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:35:12:35:16 | [ensure: raise] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: raise] if ... | false | -| break_ensure.rb:35:12:35:16 | [ensure: raise] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: raise] break | true | +| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | +| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | | break_ensure.rb:35:16:35:16 | 0 | break_ensure.rb:35:12:35:16 | ... > ... | | -| break_ensure.rb:35:16:35:16 | [ensure: raise] 0 | break_ensure.rb:35:12:35:16 | [ensure: raise] ... > ... | | +| break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | | | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | | -| break_ensure.rb:36:11:36:15 | [ensure: raise] break | break_ensure.rb:33:5:39:7 | [ensure: raise] while ... | break | +| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break | | break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break | | break_ensure.rb:36:11:36:15 | break | break_ensure.rb:33:5:39:7 | while ... | break | | break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:27:1:42:3 | exit m3 (normal) | | @@ -158,27 +158,27 @@ | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:14:47:14 | 1 | | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:7:49:9 | if ... | false | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:51:10:51:10 | [ensure: raise] x | raise | +| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | | break_ensure.rb:47:14:47:14 | 1 | break_ensure.rb:47:10:47:14 | ... > ... | | -| break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:51:10:51:10 | [ensure: raise] x | raise | +| break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:15:48:16 | "" | | | break_ensure.rb:48:15:48:16 | "" | break_ensure.rb:48:9:48:16 | call to raise | | -| break_ensure.rb:50:5:53:9 | [ensure: raise] ensure ... | break_ensure.rb:45:3:55:5 | while ... | raise | +| break_ensure.rb:50:5:53:9 | [ensure: exception] ensure ... | break_ensure.rb:45:3:55:5 | while ... | exception | | break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:45:14:55:5 | do ... | | -| break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | break_ensure.rb:50:5:53:9 | [ensure: raise] ensure ... | | +| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:50:5:53:9 | [ensure: exception] ensure ... | | | break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:50:5:53:9 | ensure ... | | -| break_ensure.rb:51:10:51:10 | [ensure: raise] x | break_ensure.rb:51:14:51:14 | [ensure: raise] 0 | | +| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | | break_ensure.rb:51:10:51:10 | x | break_ensure.rb:51:14:51:14 | 0 | | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:7:53:9 | if ... | false | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:51:10:51:14 | [ensure: raise] ... > ... | break_ensure.rb:51:7:53:9 | [ensure: raise] if ... | false | -| break_ensure.rb:51:10:51:14 | [ensure: raise] ... > ... | break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | true | +| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | +| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | | break_ensure.rb:51:14:51:14 | 0 | break_ensure.rb:51:10:51:14 | ... > ... | | -| break_ensure.rb:51:14:51:14 | [ensure: raise] 0 | break_ensure.rb:51:10:51:14 | [ensure: raise] ... > ... | | -| break_ensure.rb:52:9:52:16 | [ensure: raise] break | break_ensure.rb:45:3:55:5 | while ... | break | +| break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | | +| break_ensure.rb:52:9:52:16 | [ensure: exception] break | break_ensure.rb:45:3:55:5 | while ... | break | | break_ensure.rb:52:9:52:16 | break | break_ensure.rb:45:3:55:5 | while ... | break | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:9:52:16 | break | | -| break_ensure.rb:52:15:52:16 | [ensure: raise] 10 | break_ensure.rb:52:9:52:16 | [ensure: raise] break | | +| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:9:52:16 | [ensure: exception] break | | | case.rb:1:1:6:3 | enter if_in_case | case.rb:2:8:2:9 | self | | | case.rb:1:1:6:3 | exit if_in_case (normal) | case.rb:1:1:6:3 | exit if_in_case | | | case.rb:1:1:6:3 | if_in_case | case.rb:8:1:18:3 | case_match | | @@ -256,7 +256,7 @@ | case.rb:21:3:23:5 | case ... | case.rb:20:1:24:3 | exit case_match_no_match (normal) | | | case.rb:21:8:21:12 | value | case.rb:22:5:22:8 | in ... then ... | | | case.rb:22:5:22:8 | in ... then ... | case.rb:22:8:22:8 | 1 | | -| case.rb:22:8:22:8 | 1 | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | raise | +| case.rb:22:8:22:8 | 1 | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | exception | | case.rb:22:8:22:8 | 1 | case.rb:21:3:23:5 | case ... | match | | case.rb:26:1:30:3 | case_match_raise | case.rb:32:1:39:3 | case_match_array | | | case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:22:26:26 | value | | @@ -266,12 +266,12 @@ | case.rb:27:3:29:5 | case ... | case.rb:26:1:30:3 | exit case_match_raise (normal) | | | case.rb:27:8:27:12 | value | case.rb:28:4:28:28 | in ... then ... | | | case.rb:28:4:28:28 | in ... then ... | case.rb:28:7:28:28 | -> { ... } | | -| case.rb:28:7:28:28 | -> { ... } | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | raise | +| case.rb:28:7:28:28 | -> { ... } | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | exception | | case.rb:28:7:28:28 | -> { ... } | case.rb:27:3:29:5 | case ... | match | | case.rb:28:7:28:28 | enter -> { ... } | case.rb:28:10:28:10 | x | | | case.rb:28:7:28:28 | exit -> { ... } (abnormal) | case.rb:28:7:28:28 | exit -> { ... } | | | case.rb:28:10:28:10 | x | case.rb:28:14:28:25 | self | | -| case.rb:28:14:28:25 | call to raise | case.rb:28:7:28:28 | exit -> { ... } (abnormal) | raise | +| case.rb:28:14:28:25 | call to raise | case.rb:28:7:28:28 | exit -> { ... } (abnormal) | exception | | case.rb:28:14:28:25 | self | case.rb:28:21:28:24 | oops | | | case.rb:28:20:28:25 | "oops" | case.rb:28:14:28:25 | call to raise | | | case.rb:28:21:28:24 | oops | case.rb:28:20:28:25 | "oops" | | @@ -294,9 +294,9 @@ | case.rb:36:8:36:12 | [ ..., * ] | case.rb:37:5:37:27 | in ... then ... | no-match | | case.rb:36:9:36:9 | x | case.rb:33:3:38:5 | case ... | match | | case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:10 | Bar | | -| case.rb:37:8:37:10 | Bar | case.rb:32:1:39:3 | exit case_match_array (abnormal) | raise | +| case.rb:37:8:37:10 | Bar | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | | case.rb:37:8:37:10 | Bar | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | raise | +| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | | case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false, match, true | | case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | match | | case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | @@ -311,12 +311,12 @@ | case.rb:42:3:44:5 | case ... | case.rb:41:1:45:3 | exit case_match_find (normal) | | | case.rb:42:8:42:12 | value | case.rb:43:5:43:22 | in ... then ... | | | case.rb:43:5:43:22 | in ... then ... | case.rb:43:8:43:21 | [ *,...,* ] | | -| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:8:43:21 | [ *,...,* ] | case.rb:43:10:43:10 | x | false, match, true | | case.rb:43:10:43:10 | x | case.rb:43:13:43:13 | 1 | | -| case.rb:43:13:43:13 | 1 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:13:43:13 | 1 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:13:43:13 | 1 | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | raise | +| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | | case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | | case.rb:43:20:43:20 | y | case.rb:42:3:44:5 | case ... | | | case.rb:47:1:53:3 | case_match_hash | case.rb:55:1:61:3 | case_match_variable | | @@ -344,9 +344,9 @@ | case.rb:50:16:50:16 | 1 | case.rb:48:3:52:5 | case ... | match | | case.rb:50:16:50:16 | 1 | case.rb:51:5:51:17 | in ... then ... | no-match | | case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:10 | Bar | | -| case.rb:51:8:51:10 | Bar | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | raise | +| case.rb:51:8:51:10 | Bar | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | | case.rb:51:8:51:10 | Bar | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | raise | +| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | | case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | false, match, true | | case.rb:55:1:61:3 | case_match_variable | case.rb:63:1:67:3 | case_match_underscore | | | case.rb:55:1:61:3 | enter case_match_variable | case.rb:55:25:55:29 | value | | @@ -500,7 +500,7 @@ | case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | | case.rb:91:18:91:19 | [ ..., * ] | case.rb:72:3:92:5 | case ... | match | | case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | raise | +| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | exception | | case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | false, match, true | | case.rb:95:1:99:3 | case_match_guard_no_else | case.rb:1:1:99:4 | exit case.rb (normal) | | | case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:30:95:34 | value | | @@ -512,7 +512,7 @@ | case.rb:97:5:97:25 | in ... then ... | case.rb:97:8:97:8 | x | | | case.rb:97:8:97:8 | x | case.rb:97:13:97:13 | x | match | | case.rb:97:13:97:13 | x | case.rb:97:18:97:18 | 5 | | -| case.rb:97:13:97:18 | ... == ... | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | raise | +| case.rb:97:13:97:18 | ... == ... | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | exception | | case.rb:97:13:97:18 | ... == ... | case.rb:97:25:97:25 | 6 | true | | case.rb:97:18:97:18 | 5 | case.rb:97:13:97:18 | ... == ... | | | case.rb:97:20:97:25 | then ... | case.rb:96:3:98:5 | case ... | | @@ -870,7 +870,7 @@ | cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:3:91:24 | if ... | false | | cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:17:91:20 | next | true | | cfg.rb:91:10:91:10 | 3 | cfg.rb:91:6:91:10 | ... > ... | | -| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | exit { ... } (normal) | next | +| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | exit { ... } (normal) | continue | | cfg.rb:92:3:92:8 | call to puts | cfg.rb:90:1:93:3 | exit { ... } (normal) | | | cfg.rb:92:3:92:8 | self | cfg.rb:92:8:92:8 | x | | | cfg.rb:92:8:92:8 | x | cfg.rb:92:3:92:8 | call to puts | | @@ -1024,7 +1024,7 @@ | cfg.rb:134:1:134:23 | EmptyModule | cfg.rb:136:1:136:1 | 1 | | | cfg.rb:136:1:136:1 | 1 | cfg.rb:136:3:136:3 | 0 | | | cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:1:136:29 | ... rescue ... | | -| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:12:136:29 | self | raise | +| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:12:136:29 | self | exception | | cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:138:17:138:23 | __synth__2 | | | cfg.rb:136:3:136:3 | 0 | cfg.rb:136:1:136:3 | ... / ... | | | cfg.rb:136:12:136:29 | call to puts | cfg.rb:136:1:136:29 | ... rescue ... | | @@ -1828,7 +1828,7 @@ | loops.rb:14:11:14:16 | ... > ... | loops.rb:15:7:15:10 | next | true | | loops.rb:14:11:14:16 | ... > ... | loops.rb:16:11:16:11 | x | false | | loops.rb:14:15:14:16 | 50 | loops.rb:14:11:14:16 | ... > ... | | -| loops.rb:15:7:15:10 | next | loops.rb:9:9:9:9 | x | next | +| loops.rb:15:7:15:10 | next | loops.rb:9:9:9:9 | x | continue | | loops.rb:16:5:17:10 | elsif ... | loops.rb:14:5:17:10 | elsif ... | | | loops.rb:16:11:16:11 | x | loops.rb:16:15:16:16 | 10 | | | loops.rb:16:11:16:16 | ... > ... | loops.rb:16:5:17:10 | elsif ... | false | @@ -1886,7 +1886,7 @@ | raise.rb:8:6:8:10 | ... > ... | raise.rb:8:3:10:5 | if ... | false | | raise.rb:8:6:8:10 | ... > ... | raise.rb:9:5:9:17 | self | true | | raise.rb:8:10:8:10 | 2 | raise.rb:8:6:8:10 | ... > ... | | -| raise.rb:9:5:9:17 | call to raise | raise.rb:7:1:12:3 | exit m1 (abnormal) | raise | +| raise.rb:9:5:9:17 | call to raise | raise.rb:7:1:12:3 | exit m1 (abnormal) | exception | | raise.rb:9:5:9:17 | self | raise.rb:9:12:9:16 | x > 2 | | | raise.rb:9:11:9:17 | "x > 2" | raise.rb:9:5:9:17 | call to raise | | | raise.rb:9:12:9:16 | x > 2 | raise.rb:9:11:9:17 | "x > 2" | | @@ -1902,11 +1902,11 @@ | raise.rb:16:5:18:7 | if ... | raise.rb:22:3:22:15 | self | | | raise.rb:16:8:16:8 | b | raise.rb:16:5:18:7 | if ... | false | | raise.rb:16:8:16:8 | b | raise.rb:17:7:17:22 | self | true | -| raise.rb:17:7:17:22 | call to raise | raise.rb:19:10:19:19 | ExceptionA | raise | +| raise.rb:17:7:17:22 | call to raise | raise.rb:19:10:19:19 | ExceptionA | exception | | raise.rb:17:7:17:22 | self | raise.rb:17:13:17:22 | ExceptionA | | | raise.rb:17:13:17:22 | ExceptionA | raise.rb:17:7:17:22 | call to raise | | | raise.rb:19:3:20:18 | rescue ... | raise.rb:22:3:22:15 | self | | -| raise.rb:19:10:19:19 | ExceptionA | raise.rb:14:1:23:3 | exit m2 (abnormal) | raise | +| raise.rb:19:10:19:19 | ExceptionA | raise.rb:14:1:23:3 | exit m2 (abnormal) | exception | | raise.rb:19:10:19:19 | ExceptionA | raise.rb:20:5:20:18 | self | match | | raise.rb:19:20:20:18 | then ... | raise.rb:19:3:20:18 | rescue ... | | | raise.rb:20:5:20:18 | call to puts | raise.rb:19:20:20:18 | then ... | | @@ -1924,7 +1924,7 @@ | raise.rb:27:5:29:7 | if ... | raise.rb:33:3:33:15 | self | | | raise.rb:27:8:27:8 | b | raise.rb:27:5:29:7 | if ... | false | | raise.rb:27:8:27:8 | b | raise.rb:28:7:28:22 | self | true | -| raise.rb:28:7:28:22 | call to raise | raise.rb:31:5:31:18 | self | raise | +| raise.rb:28:7:28:22 | call to raise | raise.rb:31:5:31:18 | self | exception | | raise.rb:28:7:28:22 | self | raise.rb:28:13:28:22 | ExceptionA | | | raise.rb:28:13:28:22 | ExceptionA | raise.rb:28:7:28:22 | call to raise | | | raise.rb:30:3:31:18 | rescue ... | raise.rb:33:3:33:15 | self | | @@ -1944,7 +1944,7 @@ | raise.rb:38:5:40:7 | if ... | raise.rb:44:3:44:15 | self | | | raise.rb:38:8:38:8 | b | raise.rb:38:5:40:7 | if ... | false | | raise.rb:38:8:38:8 | b | raise.rb:39:7:39:22 | self | true | -| raise.rb:39:7:39:22 | call to raise | raise.rb:41:13:41:13 | e | raise | +| raise.rb:39:7:39:22 | call to raise | raise.rb:41:13:41:13 | e | exception | | raise.rb:39:7:39:22 | self | raise.rb:39:13:39:22 | ExceptionA | | | raise.rb:39:13:39:22 | ExceptionA | raise.rb:39:7:39:22 | call to raise | | | raise.rb:41:3:42:22 | rescue ... | raise.rb:44:3:44:15 | self | | @@ -1965,7 +1965,7 @@ | raise.rb:49:5:51:7 | if ... | raise.rb:54:3:54:15 | self | | | raise.rb:49:8:49:8 | b | raise.rb:49:5:51:7 | if ... | false | | raise.rb:49:8:49:8 | b | raise.rb:50:7:50:22 | self | true | -| raise.rb:50:7:50:22 | call to raise | raise.rb:52:13:52:13 | e | raise | +| raise.rb:50:7:50:22 | call to raise | raise.rb:52:13:52:13 | e | exception | | raise.rb:50:7:50:22 | self | raise.rb:50:13:50:22 | ExceptionA | | | raise.rb:50:13:50:22 | ExceptionA | raise.rb:50:7:50:22 | call to raise | | | raise.rb:52:3:52:13 | rescue ... | raise.rb:54:3:54:15 | self | | @@ -1982,13 +1982,13 @@ | raise.rb:59:5:61:7 | if ... | raise.rb:65:3:65:15 | self | | | raise.rb:59:8:59:8 | b | raise.rb:59:5:61:7 | if ... | false | | raise.rb:59:8:59:8 | b | raise.rb:60:7:60:22 | self | true | -| raise.rb:60:7:60:22 | call to raise | raise.rb:62:10:62:19 | ExceptionA | raise | +| raise.rb:60:7:60:22 | call to raise | raise.rb:62:10:62:19 | ExceptionA | exception | | raise.rb:60:7:60:22 | self | raise.rb:60:13:60:22 | ExceptionA | | | raise.rb:60:13:60:22 | ExceptionA | raise.rb:60:7:60:22 | call to raise | | | raise.rb:62:3:63:22 | rescue ... | raise.rb:65:3:65:15 | self | | | raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:22:62:31 | ExceptionB | no-match | | raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | raise | +| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | exception | | raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:36:62:36 | e | match | | raise.rb:62:36:62:36 | e | raise.rb:63:5:63:22 | self | | | raise.rb:62:37:63:22 | then ... | raise.rb:62:3:63:22 | rescue ... | | @@ -2009,9 +2009,9 @@ | raise.rb:69:6:69:6 | x | raise.rb:69:10:69:10 | 2 | | | raise.rb:69:6:69:10 | ... > ... | raise.rb:70:5:70:17 | self | true | | raise.rb:69:6:69:10 | ... > ... | raise.rb:71:9:71:9 | x | false | -| raise.rb:69:6:69:10 | ... > ... | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:69:6:69:10 | ... > ... | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:69:10:69:10 | 2 | raise.rb:69:6:69:10 | ... > ... | | -| raise.rb:70:5:70:17 | call to raise | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:70:5:70:17 | call to raise | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:70:5:70:17 | self | raise.rb:70:12:70:16 | x > 2 | | | raise.rb:70:11:70:17 | "x > 2" | raise.rb:70:5:70:17 | call to raise | | | raise.rb:70:12:70:16 | x > 2 | raise.rb:70:11:70:17 | "x > 2" | | @@ -2019,29 +2019,29 @@ | raise.rb:71:9:71:9 | x | raise.rb:71:13:71:13 | 0 | | | raise.rb:71:9:71:13 | ... < ... | raise.rb:71:3:72:18 | elsif ... | false | | raise.rb:71:9:71:13 | ... < ... | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:13 | ... < ... | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:71:9:71:13 | ... < ... | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:71:13:71:13 | 0 | raise.rb:71:9:71:13 | ... < ... | | | raise.rb:72:5:72:18 | return | raise.rb:76:3:76:15 | [ensure: return] self | return | | raise.rb:72:12:72:18 | "x < 0" | raise.rb:72:5:72:18 | return | | | raise.rb:72:13:72:17 | x < 0 | raise.rb:72:12:72:18 | "x < 0" | | -| raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | [ensure: raise] self | raise | +| raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | [ensure: exception] self | exception | | raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | self | | | raise.rb:74:3:74:20 | self | raise.rb:74:9:74:19 | 0 <= x <= 2 | | | raise.rb:74:8:74:20 | "0 <= x <= 2" | raise.rb:74:3:74:20 | call to puts | | | raise.rb:74:9:74:19 | 0 <= x <= 2 | raise.rb:74:8:74:20 | "0 <= x <= 2" | | -| raise.rb:75:1:76:15 | [ensure: raise] ensure ... | raise.rb:68:1:77:3 | exit m7 (abnormal) | raise | +| raise.rb:75:1:76:15 | [ensure: exception] ensure ... | raise.rb:68:1:77:3 | exit m7 (abnormal) | exception | | raise.rb:75:1:76:15 | [ensure: return] ensure ... | raise.rb:68:1:77:3 | exit m7 (normal) | return | | raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | exit m7 (normal) | | -| raise.rb:76:3:76:15 | [ensure: raise] call to puts | raise.rb:75:1:76:15 | [ensure: raise] ensure ... | | -| raise.rb:76:3:76:15 | [ensure: raise] self | raise.rb:76:9:76:14 | [ensure: raise] ensure | | +| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:75:1:76:15 | [ensure: exception] ensure ... | | +| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:9:76:14 | [ensure: exception] ensure | | | raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:75:1:76:15 | [ensure: return] ensure ... | | | raise.rb:76:3:76:15 | [ensure: return] self | raise.rb:76:9:76:14 | [ensure: return] ensure | | | raise.rb:76:3:76:15 | call to puts | raise.rb:75:1:76:15 | ensure ... | | | raise.rb:76:3:76:15 | self | raise.rb:76:9:76:14 | ensure | | | raise.rb:76:8:76:15 | "ensure" | raise.rb:76:3:76:15 | call to puts | | -| raise.rb:76:8:76:15 | [ensure: raise] "ensure" | raise.rb:76:3:76:15 | [ensure: raise] call to puts | | +| raise.rb:76:8:76:15 | [ensure: exception] "ensure" | raise.rb:76:3:76:15 | [ensure: exception] call to puts | | | raise.rb:76:8:76:15 | [ensure: return] "ensure" | raise.rb:76:3:76:15 | [ensure: return] call to puts | | -| raise.rb:76:9:76:14 | [ensure: raise] ensure | raise.rb:76:8:76:15 | [ensure: raise] "ensure" | | +| raise.rb:76:9:76:14 | [ensure: exception] ensure | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | | | raise.rb:76:9:76:14 | [ensure: return] ensure | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | | raise.rb:76:9:76:14 | ensure | raise.rb:76:8:76:15 | "ensure" | | | raise.rb:79:1:92:3 | enter m8 | raise.rb:79:8:79:8 | x | | @@ -2057,9 +2057,9 @@ | raise.rb:82:8:82:8 | x | raise.rb:82:12:82:12 | 2 | | | raise.rb:82:8:82:12 | ... > ... | raise.rb:83:7:83:19 | self | true | | raise.rb:82:8:82:12 | ... > ... | raise.rb:84:11:84:11 | x | false | -| raise.rb:82:8:82:12 | ... > ... | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:82:8:82:12 | ... > ... | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:82:12:82:12 | 2 | raise.rb:82:8:82:12 | ... > ... | | -| raise.rb:83:7:83:19 | call to raise | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:83:7:83:19 | call to raise | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:83:7:83:19 | self | raise.rb:83:14:83:18 | x > 2 | | | raise.rb:83:13:83:19 | "x > 2" | raise.rb:83:7:83:19 | call to raise | | | raise.rb:83:14:83:18 | x > 2 | raise.rb:83:13:83:19 | "x > 2" | | @@ -2067,29 +2067,29 @@ | raise.rb:84:11:84:11 | x | raise.rb:84:15:84:15 | 0 | | | raise.rb:84:11:84:15 | ... < ... | raise.rb:84:5:85:20 | elsif ... | false | | raise.rb:84:11:84:15 | ... < ... | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:15 | ... < ... | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:84:11:84:15 | ... < ... | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:84:15:84:15 | 0 | raise.rb:84:11:84:15 | ... < ... | | | raise.rb:85:7:85:20 | return | raise.rb:89:5:89:17 | [ensure: return] self | return | | raise.rb:85:14:85:20 | "x < 0" | raise.rb:85:7:85:20 | return | | | raise.rb:85:15:85:19 | x < 0 | raise.rb:85:14:85:20 | "x < 0" | | -| raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | [ensure: raise] self | raise | +| raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | [ensure: exception] self | exception | | raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | self | | | raise.rb:87:5:87:22 | self | raise.rb:87:11:87:21 | 0 <= x <= 2 | | | raise.rb:87:10:87:22 | "0 <= x <= 2" | raise.rb:87:5:87:22 | call to puts | | | raise.rb:87:11:87:21 | 0 <= x <= 2 | raise.rb:87:10:87:22 | "0 <= x <= 2" | | -| raise.rb:88:3:89:17 | [ensure: raise] ensure ... | raise.rb:79:1:92:3 | exit m8 (abnormal) | raise | +| raise.rb:88:3:89:17 | [ensure: exception] ensure ... | raise.rb:79:1:92:3 | exit m8 (abnormal) | exception | | raise.rb:88:3:89:17 | [ensure: return] ensure ... | raise.rb:79:1:92:3 | exit m8 (normal) | return | | raise.rb:88:3:89:17 | ensure ... | raise.rb:91:3:91:15 | self | | -| raise.rb:89:5:89:17 | [ensure: raise] call to puts | raise.rb:88:3:89:17 | [ensure: raise] ensure ... | | -| raise.rb:89:5:89:17 | [ensure: raise] self | raise.rb:89:11:89:16 | [ensure: raise] ensure | | +| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:88:3:89:17 | [ensure: exception] ensure ... | | +| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:11:89:16 | [ensure: exception] ensure | | | raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:88:3:89:17 | [ensure: return] ensure ... | | | raise.rb:89:5:89:17 | [ensure: return] self | raise.rb:89:11:89:16 | [ensure: return] ensure | | | raise.rb:89:5:89:17 | call to puts | raise.rb:88:3:89:17 | ensure ... | | | raise.rb:89:5:89:17 | self | raise.rb:89:11:89:16 | ensure | | | raise.rb:89:10:89:17 | "ensure" | raise.rb:89:5:89:17 | call to puts | | -| raise.rb:89:10:89:17 | [ensure: raise] "ensure" | raise.rb:89:5:89:17 | [ensure: raise] call to puts | | +| raise.rb:89:10:89:17 | [ensure: exception] "ensure" | raise.rb:89:5:89:17 | [ensure: exception] call to puts | | | raise.rb:89:10:89:17 | [ensure: return] "ensure" | raise.rb:89:5:89:17 | [ensure: return] call to puts | | -| raise.rb:89:11:89:16 | [ensure: raise] ensure | raise.rb:89:10:89:17 | [ensure: raise] "ensure" | | +| raise.rb:89:11:89:16 | [ensure: exception] ensure | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | | | raise.rb:89:11:89:16 | [ensure: return] ensure | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | | raise.rb:89:11:89:16 | ensure | raise.rb:89:10:89:17 | "ensure" | | | raise.rb:91:3:91:15 | call to puts | raise.rb:79:1:92:3 | exit m8 (normal) | | @@ -2104,7 +2104,7 @@ | raise.rb:94:11:94:12 | b1 | raise.rb:94:15:94:16 | b2 | | | raise.rb:94:15:94:16 | b2 | raise.rb:95:3:95:17 | self | | | raise.rb:95:3:95:17 | call to puts | raise.rb:97:8:97:8 | x | | -| raise.rb:95:3:95:17 | call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:95:3:95:17 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:95:3:95:17 | self | raise.rb:95:9:95:16 | Begin m9 | | | raise.rb:95:8:95:17 | "Begin m9" | raise.rb:95:3:95:17 | call to puts | | | raise.rb:95:9:95:16 | Begin m9 | raise.rb:95:8:95:17 | "Begin m9" | | @@ -2112,9 +2112,9 @@ | raise.rb:97:8:97:8 | x | raise.rb:97:12:97:12 | 2 | | | raise.rb:97:8:97:12 | ... > ... | raise.rb:98:7:98:19 | self | true | | raise.rb:97:8:97:12 | ... > ... | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:12 | ... > ... | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:97:8:97:12 | ... > ... | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:97:12:97:12 | 2 | raise.rb:97:8:97:12 | ... > ... | | -| raise.rb:98:7:98:19 | call to raise | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:98:7:98:19 | call to raise | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:98:7:98:19 | self | raise.rb:98:14:98:18 | x > 2 | | | raise.rb:98:13:98:19 | "x > 2" | raise.rb:98:7:98:19 | call to raise | | | raise.rb:98:14:98:18 | x > 2 | raise.rb:98:13:98:19 | "x > 2" | | @@ -2122,130 +2122,130 @@ | raise.rb:99:11:99:11 | x | raise.rb:99:15:99:15 | 0 | | | raise.rb:99:11:99:15 | ... < ... | raise.rb:99:5:100:20 | elsif ... | false | | raise.rb:99:11:99:15 | ... < ... | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:15 | ... < ... | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:99:11:99:15 | ... < ... | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:99:15:99:15 | 0 | raise.rb:99:11:99:15 | ... < ... | | | raise.rb:100:7:100:20 | return | raise.rb:104:5:104:23 | [ensure: return] self | return | | raise.rb:100:14:100:20 | "x < 0" | raise.rb:100:7:100:20 | return | | | raise.rb:100:15:100:19 | x < 0 | raise.rb:100:14:100:20 | "x < 0" | | -| raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | [ensure: raise] self | raise | +| raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | [ensure: exception] self | exception | | raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | self | | | raise.rb:102:5:102:22 | self | raise.rb:102:11:102:21 | 0 <= x <= 2 | | | raise.rb:102:10:102:22 | "0 <= x <= 2" | raise.rb:102:5:102:22 | call to puts | | | raise.rb:102:11:102:21 | 0 <= x <= 2 | raise.rb:102:10:102:22 | "0 <= x <= 2" | | -| raise.rb:103:3:111:7 | [ensure: raise] ensure ... | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:103:3:111:7 | [ensure: exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:103:3:111:7 | [ensure: return] ensure ... | raise.rb:115:3:115:22 | [ensure: return] self | return | | raise.rb:103:3:111:7 | ensure ... | raise.rb:113:3:113:15 | self | | -| raise.rb:104:5:104:23 | [ensure: raise] call to puts | raise.rb:106:10:106:11 | [ensure: raise] b1 | | -| raise.rb:104:5:104:23 | [ensure: raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:104:5:104:23 | [ensure: raise] self | raise.rb:104:11:104:22 | [ensure: raise] outer ensure | | +| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:106:10:106:11 | [ensure: exception] b1 | | +| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:11:104:22 | [ensure: exception] outer ensure | | | raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:106:10:106:11 | [ensure: return] b1 | | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:104:5:104:23 | [ensure: return] self | raise.rb:104:11:104:22 | [ensure: return] outer ensure | | | raise.rb:104:5:104:23 | call to puts | raise.rb:106:10:106:11 | b1 | | -| raise.rb:104:5:104:23 | call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:104:5:104:23 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:104:5:104:23 | self | raise.rb:104:11:104:22 | outer ensure | | | raise.rb:104:10:104:23 | "outer ensure" | raise.rb:104:5:104:23 | call to puts | | -| raise.rb:104:10:104:23 | [ensure: raise] "outer ensure" | raise.rb:104:5:104:23 | [ensure: raise] call to puts | | +| raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | raise.rb:104:5:104:23 | [ensure: exception] call to puts | | | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | raise.rb:104:5:104:23 | [ensure: return] call to puts | | -| raise.rb:104:11:104:22 | [ensure: raise] outer ensure | raise.rb:104:10:104:23 | [ensure: raise] "outer ensure" | | +| raise.rb:104:11:104:22 | [ensure: exception] outer ensure | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | | | raise.rb:104:11:104:22 | [ensure: return] outer ensure | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | | raise.rb:104:11:104:22 | outer ensure | raise.rb:104:10:104:23 | "outer ensure" | | -| raise.rb:106:7:108:9 | [ensure: raise] if ... | raise.rb:110:7:110:25 | [ensure: raise] self | | +| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:110:7:110:25 | [ensure: exception] self | | | raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:110:7:110:25 | [ensure: return] self | | | raise.rb:106:7:108:9 | if ... | raise.rb:110:7:110:25 | self | | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:106:7:108:9 | [ensure: raise] if ... | false | -| raise.rb:106:10:106:11 | [ensure: raise] b1 | raise.rb:107:9:107:26 | [ensure: raise] self | true | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | +| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | | raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | | raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | | raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:107:9:107:26 | [ensure: raise] call to raise | raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] self | raise | -| raise.rb:107:9:107:26 | [ensure: raise] self | raise.rb:107:16:107:25 | [ensure: raise] b1 is true | | -| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] self | raise | +| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] self | exception | +| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:16:107:25 | [ensure: exception] b1 is true | | +| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] self | exception | | raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:16:107:25 | [ensure: return] b1 is true | | -| raise.rb:107:9:107:26 | call to raise | raise.rb:110:7:110:25 | [ensure(1): raise] self | raise | +| raise.rb:107:9:107:26 | call to raise | raise.rb:110:7:110:25 | [ensure(1): exception] self | exception | | raise.rb:107:9:107:26 | self | raise.rb:107:16:107:25 | b1 is true | | | raise.rb:107:15:107:26 | "b1 is true" | raise.rb:107:9:107:26 | call to raise | | -| raise.rb:107:15:107:26 | [ensure: raise] "b1 is true" | raise.rb:107:9:107:26 | [ensure: raise] call to raise | | +| raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | raise.rb:107:9:107:26 | [ensure: exception] call to raise | | | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | raise.rb:107:9:107:26 | [ensure: return] call to raise | | -| raise.rb:107:16:107:25 | [ensure: raise] b1 is true | raise.rb:107:15:107:26 | [ensure: raise] "b1 is true" | | +| raise.rb:107:16:107:25 | [ensure: exception] b1 is true | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | | | raise.rb:107:16:107:25 | [ensure: return] b1 is true | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | | raise.rb:107:16:107:25 | b1 is true | raise.rb:107:15:107:26 | "b1 is true" | | -| raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:109:5:110:25 | [ensure: raise] ensure ... | raise.rb:103:3:111:7 | [ensure: raise] ensure ... | | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:103:3:111:7 | [ensure: exception] ensure ... | | +| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:103:3:111:7 | [ensure: return] ensure ... | | | raise.rb:109:5:110:25 | ensure ... | raise.rb:103:3:111:7 | ensure ... | | -| raise.rb:110:7:110:25 | [ensure(1): raise] call to puts | raise.rb:109:5:110:25 | [ensure(1): raise] ensure ... | | -| raise.rb:110:7:110:25 | [ensure(1): raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:110:7:110:25 | [ensure(1): raise] self | raise.rb:110:13:110:24 | [ensure(1): raise] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] call to puts | raise.rb:109:5:110:25 | [ensure: raise, ensure(1): raise] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] self | raise.rb:110:13:110:24 | [ensure: raise, ensure(1): raise] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: raise] call to puts | raise.rb:109:5:110:25 | [ensure: raise] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:110:7:110:25 | [ensure: raise] self | raise.rb:110:13:110:24 | [ensure: raise] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] call to puts | raise.rb:109:5:110:25 | [ensure: return, ensure(1): raise] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] self | raise.rb:110:13:110:24 | [ensure: return, ensure(1): raise] inner ensure | | +| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | +| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:110:7:110:25 | [ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure(1): exception] inner ensure | | +| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | | +| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure: exception, ensure(1): exception] inner ensure | | +| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | +| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:110:7:110:25 | [ensure: exception] self | raise.rb:110:13:110:24 | [ensure: exception] inner ensure | | +| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | +| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | +| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure: return, ensure(1): exception] inner ensure | | | raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:110:7:110:25 | [ensure: return] self | raise.rb:110:13:110:24 | [ensure: return] inner ensure | | | raise.rb:110:7:110:25 | call to puts | raise.rb:109:5:110:25 | ensure ... | | -| raise.rb:110:7:110:25 | call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:110:7:110:25 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:110:7:110:25 | self | raise.rb:110:13:110:24 | inner ensure | | | raise.rb:110:12:110:25 | "inner ensure" | raise.rb:110:7:110:25 | call to puts | | -| raise.rb:110:12:110:25 | [ensure(1): raise] "inner ensure" | raise.rb:110:7:110:25 | [ensure(1): raise] call to puts | | -| raise.rb:110:12:110:25 | [ensure: raise, ensure(1): raise] "inner ensure" | raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] call to puts | | -| raise.rb:110:12:110:25 | [ensure: raise] "inner ensure" | raise.rb:110:7:110:25 | [ensure: raise] call to puts | | -| raise.rb:110:12:110:25 | [ensure: return, ensure(1): raise] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] call to puts | | +| raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | | +| raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | | +| raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: exception] call to puts | | +| raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | | | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return] call to puts | | -| raise.rb:110:13:110:24 | [ensure(1): raise] inner ensure | raise.rb:110:12:110:25 | [ensure(1): raise] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: raise, ensure(1): raise] inner ensure | raise.rb:110:12:110:25 | [ensure: raise, ensure(1): raise] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: raise] inner ensure | raise.rb:110:12:110:25 | [ensure: raise] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: return, ensure(1): raise] inner ensure | raise.rb:110:12:110:25 | [ensure: return, ensure(1): raise] "inner ensure" | | +| raise.rb:110:13:110:24 | [ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | | +| raise.rb:110:13:110:24 | [ensure: exception, ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | | +| raise.rb:110:13:110:24 | [ensure: exception] inner ensure | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | | +| raise.rb:110:13:110:24 | [ensure: return, ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | | | raise.rb:110:13:110:24 | [ensure: return] inner ensure | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | | raise.rb:110:13:110:24 | inner ensure | raise.rb:110:12:110:25 | "inner ensure" | | -| raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | [ensure: raise] self | raise | +| raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | | raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | self | | | raise.rb:113:3:113:15 | self | raise.rb:113:9:113:14 | End m9 | | | raise.rb:113:8:113:15 | "End m9" | raise.rb:113:3:113:15 | call to puts | | | raise.rb:113:9:113:14 | End m9 | raise.rb:113:8:113:15 | "End m9" | | -| raise.rb:114:1:118:5 | [ensure: raise] ensure ... | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise | +| raise.rb:114:1:118:5 | [ensure: exception] ensure ... | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | | raise.rb:114:1:118:5 | [ensure: return] ensure ... | raise.rb:94:1:119:3 | exit m9 (normal) | return | | raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | exit m9 (normal) | | -| raise.rb:115:3:115:22 | [ensure: raise] call to puts | raise.rb:116:6:116:7 | [ensure: raise] b2 | | -| raise.rb:115:3:115:22 | [ensure: raise] self | raise.rb:115:9:115:21 | [ensure: raise] method ensure | | +| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:116:6:116:7 | [ensure: exception] b2 | | +| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:9:115:21 | [ensure: exception] method ensure | | | raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:116:6:116:7 | [ensure: return] b2 | | | raise.rb:115:3:115:22 | [ensure: return] self | raise.rb:115:9:115:21 | [ensure: return] method ensure | | | raise.rb:115:3:115:22 | call to puts | raise.rb:116:6:116:7 | b2 | | | raise.rb:115:3:115:22 | self | raise.rb:115:9:115:21 | method ensure | | | raise.rb:115:8:115:22 | "method ensure" | raise.rb:115:3:115:22 | call to puts | | -| raise.rb:115:8:115:22 | [ensure: raise] "method ensure" | raise.rb:115:3:115:22 | [ensure: raise] call to puts | | +| raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | raise.rb:115:3:115:22 | [ensure: exception] call to puts | | | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | raise.rb:115:3:115:22 | [ensure: return] call to puts | | -| raise.rb:115:9:115:21 | [ensure: raise] method ensure | raise.rb:115:8:115:22 | [ensure: raise] "method ensure" | | +| raise.rb:115:9:115:21 | [ensure: exception] method ensure | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | | | raise.rb:115:9:115:21 | [ensure: return] method ensure | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | | raise.rb:115:9:115:21 | method ensure | raise.rb:115:8:115:22 | "method ensure" | | -| raise.rb:116:3:118:5 | [ensure: raise] if ... | raise.rb:114:1:118:5 | [ensure: raise] ensure ... | | +| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:114:1:118:5 | [ensure: exception] ensure ... | | | raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:114:1:118:5 | [ensure: return] ensure ... | | | raise.rb:116:3:118:5 | if ... | raise.rb:114:1:118:5 | ensure ... | | -| raise.rb:116:6:116:7 | [ensure: raise] b2 | raise.rb:116:3:118:5 | [ensure: raise] if ... | false | -| raise.rb:116:6:116:7 | [ensure: raise] b2 | raise.rb:117:5:117:22 | [ensure: raise] self | true | +| raise.rb:116:6:116:7 | [ensure: exception] b2 | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | +| raise.rb:116:6:116:7 | [ensure: exception] b2 | raise.rb:117:5:117:22 | [ensure: exception] self | true | | raise.rb:116:6:116:7 | [ensure: return] b2 | raise.rb:116:3:118:5 | [ensure: return] if ... | false | | raise.rb:116:6:116:7 | [ensure: return] b2 | raise.rb:117:5:117:22 | [ensure: return] self | true | | raise.rb:116:6:116:7 | b2 | raise.rb:116:3:118:5 | if ... | false | | raise.rb:116:6:116:7 | b2 | raise.rb:117:5:117:22 | self | true | -| raise.rb:117:5:117:22 | [ensure: raise] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise | -| raise.rb:117:5:117:22 | [ensure: raise] self | raise.rb:117:12:117:21 | [ensure: raise] b2 is true | | -| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise | +| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | +| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:12:117:21 | [ensure: exception] b2 is true | | +| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | | raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:12:117:21 | [ensure: return] b2 is true | | -| raise.rb:117:5:117:22 | call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise | +| raise.rb:117:5:117:22 | call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | | raise.rb:117:5:117:22 | self | raise.rb:117:12:117:21 | b2 is true | | | raise.rb:117:11:117:22 | "b2 is true" | raise.rb:117:5:117:22 | call to raise | | -| raise.rb:117:11:117:22 | [ensure: raise] "b2 is true" | raise.rb:117:5:117:22 | [ensure: raise] call to raise | | +| raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | raise.rb:117:5:117:22 | [ensure: exception] call to raise | | | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | raise.rb:117:5:117:22 | [ensure: return] call to raise | | -| raise.rb:117:12:117:21 | [ensure: raise] b2 is true | raise.rb:117:11:117:22 | [ensure: raise] "b2 is true" | | +| raise.rb:117:12:117:21 | [ensure: exception] b2 is true | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | | | raise.rb:117:12:117:21 | [ensure: return] b2 is true | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | | raise.rb:117:12:117:21 | b2 is true | raise.rb:117:11:117:22 | "b2 is true" | | | raise.rb:121:1:126:3 | enter m10 | raise.rb:121:9:121:9 | p | | @@ -2254,7 +2254,7 @@ | raise.rb:121:1:126:3 | m10 | raise.rb:128:1:140:3 | m11 | | | raise.rb:121:9:121:9 | p | raise.rb:121:14:121:30 | self | false, no-match, true | | raise.rb:121:9:121:9 | p | raise.rb:125:3:125:51 | self | match | -| raise.rb:121:14:121:30 | call to raise | raise.rb:121:1:126:3 | exit m10 (abnormal) | raise | +| raise.rb:121:14:121:30 | call to raise | raise.rb:121:1:126:3 | exit m10 (abnormal) | exception | | raise.rb:121:14:121:30 | self | raise.rb:121:21:121:29 | Exception | | | raise.rb:121:20:121:30 | "Exception" | raise.rb:121:14:121:30 | call to raise | | | raise.rb:121:21:121:29 | Exception | raise.rb:121:20:121:30 | "Exception" | | @@ -2271,7 +2271,7 @@ | raise.rb:130:5:132:7 | if ... | raise.rb:137:5:137:17 | self | | | raise.rb:130:8:130:8 | b | raise.rb:130:5:132:7 | if ... | false | | raise.rb:130:8:130:8 | b | raise.rb:131:7:131:22 | self | true | -| raise.rb:131:7:131:22 | call to raise | raise.rb:133:10:133:19 | ExceptionA | raise | +| raise.rb:131:7:131:22 | call to raise | raise.rb:133:10:133:19 | ExceptionA | exception | | raise.rb:131:7:131:22 | self | raise.rb:131:13:131:22 | ExceptionA | | | raise.rb:131:13:131:22 | ExceptionA | raise.rb:131:7:131:22 | call to raise | | | raise.rb:133:3:133:19 | rescue ... | raise.rb:137:5:137:17 | self | | @@ -2279,22 +2279,22 @@ | raise.rb:133:10:133:19 | ExceptionA | raise.rb:134:10:134:19 | ExceptionB | no-match | | raise.rb:134:3:135:21 | rescue ... | raise.rb:137:5:137:17 | self | | | raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: raise] self | raise | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | exception | | raise.rb:134:20:135:21 | then ... | raise.rb:134:3:135:21 | rescue ... | | | raise.rb:135:5:135:21 | call to puts | raise.rb:134:20:135:21 | then ... | | | raise.rb:135:5:135:21 | self | raise.rb:135:11:135:20 | ExceptionB | | | raise.rb:135:10:135:21 | "ExceptionB" | raise.rb:135:5:135:21 | call to puts | | | raise.rb:135:11:135:20 | ExceptionB | raise.rb:135:10:135:21 | "ExceptionB" | | -| raise.rb:136:3:137:17 | [ensure: raise] ensure ... | raise.rb:128:1:140:3 | exit m11 (abnormal) | raise | +| raise.rb:136:3:137:17 | [ensure: exception] ensure ... | raise.rb:128:1:140:3 | exit m11 (abnormal) | exception | | raise.rb:136:3:137:17 | ensure ... | raise.rb:139:3:139:16 | self | | -| raise.rb:137:5:137:17 | [ensure: raise] call to puts | raise.rb:136:3:137:17 | [ensure: raise] ensure ... | | -| raise.rb:137:5:137:17 | [ensure: raise] self | raise.rb:137:11:137:16 | [ensure: raise] Ensure | | +| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:136:3:137:17 | [ensure: exception] ensure ... | | +| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:11:137:16 | [ensure: exception] Ensure | | | raise.rb:137:5:137:17 | call to puts | raise.rb:136:3:137:17 | ensure ... | | | raise.rb:137:5:137:17 | self | raise.rb:137:11:137:16 | Ensure | | | raise.rb:137:10:137:17 | "Ensure" | raise.rb:137:5:137:17 | call to puts | | -| raise.rb:137:10:137:17 | [ensure: raise] "Ensure" | raise.rb:137:5:137:17 | [ensure: raise] call to puts | | +| raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | raise.rb:137:5:137:17 | [ensure: exception] call to puts | | | raise.rb:137:11:137:16 | Ensure | raise.rb:137:10:137:17 | "Ensure" | | -| raise.rb:137:11:137:16 | [ensure: raise] Ensure | raise.rb:137:10:137:17 | [ensure: raise] "Ensure" | | +| raise.rb:137:11:137:16 | [ensure: exception] Ensure | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | | raise.rb:139:3:139:16 | call to puts | raise.rb:128:1:140:3 | exit m11 (normal) | | | raise.rb:139:3:139:16 | self | raise.rb:139:9:139:15 | End m11 | | | raise.rb:139:8:139:16 | "End m11" | raise.rb:139:3:139:16 | call to puts | | @@ -2306,13 +2306,13 @@ | raise.rb:143:3:145:5 | if ... | raise.rb:147:10:147:10 | 3 | | | raise.rb:143:6:143:6 | b | raise.rb:143:3:145:5 | if ... | false | | raise.rb:143:6:143:6 | b | raise.rb:144:5:144:12 | self | true | -| raise.rb:144:5:144:12 | call to raise | raise.rb:147:10:147:10 | [ensure: raise] 3 | raise | +| raise.rb:144:5:144:12 | call to raise | raise.rb:147:10:147:10 | [ensure: exception] 3 | exception | | raise.rb:144:5:144:12 | self | raise.rb:144:11:144:12 | "" | | | raise.rb:144:11:144:12 | "" | raise.rb:144:5:144:12 | call to raise | | -| raise.rb:147:3:147:10 | [ensure: raise] return | raise.rb:142:1:148:3 | exit m12 (normal) | return | +| raise.rb:147:3:147:10 | [ensure: exception] return | raise.rb:142:1:148:3 | exit m12 (normal) | return | | raise.rb:147:3:147:10 | return | raise.rb:142:1:148:3 | exit m12 (normal) | return | | raise.rb:147:10:147:10 | 3 | raise.rb:147:3:147:10 | return | | -| raise.rb:147:10:147:10 | [ensure: raise] 3 | raise.rb:147:3:147:10 | [ensure: raise] return | | +| raise.rb:147:10:147:10 | [ensure: exception] 3 | raise.rb:147:3:147:10 | [ensure: exception] return | | | raise.rb:150:1:152:3 | enter m13 | raise.rb:151:1:151:6 | ensure ... | | | raise.rb:150:1:152:3 | exit m13 (normal) | raise.rb:150:1:152:3 | exit m13 | | | raise.rb:150:1:152:3 | m13 | raise.rb:154:1:156:3 | m14 | | @@ -2328,7 +2328,7 @@ | raise.rb:155:16:155:50 | exit { ... } (normal) | raise.rb:155:16:155:50 | exit { ... } | | | raise.rb:155:16:155:50 | { ... } | raise.rb:155:3:155:50 | call to each | | | raise.rb:155:19:155:22 | elem | raise.rb:155:37:155:43 | element | | -| raise.rb:155:25:155:32 | call to raise | raise.rb:155:16:155:50 | exit { ... } (abnormal) | raise | +| raise.rb:155:25:155:32 | call to raise | raise.rb:155:16:155:50 | exit { ... } (abnormal) | exception | | raise.rb:155:25:155:32 | self | raise.rb:155:31:155:32 | "" | | | raise.rb:155:25:155:48 | ... if ... | raise.rb:155:16:155:50 | exit { ... } (normal) | | | raise.rb:155:31:155:32 | "" | raise.rb:155:25:155:32 | call to raise | | @@ -2350,7 +2350,7 @@ | raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | raise.rb:160:9:162:7 | exit -> { ... } | | | raise.rb:160:9:162:7 | exit -> { ... } (normal) | raise.rb:160:9:162:7 | exit -> { ... } | | | raise.rb:160:12:160:12 | x | raise.rb:161:23:161:23 | x | | -| raise.rb:161:7:161:14 | call to raise | raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | raise | +| raise.rb:161:7:161:14 | call to raise | raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | exception | | raise.rb:161:7:161:14 | self | raise.rb:161:13:161:14 | "" | | | raise.rb:161:7:161:23 | ... unless ... | raise.rb:160:9:162:7 | exit -> { ... } (normal) | | | raise.rb:161:13:161:14 | "" | raise.rb:161:7:161:14 | call to raise | | @@ -2361,7 +2361,7 @@ | raise.rb:167:3:169:5 | exit m (abnormal) | raise.rb:167:3:169:5 | exit m | | | raise.rb:167:3:169:5 | m | raise.rb:172:1:182:3 | m16 | | | raise.rb:167:7:167:10 | self | raise.rb:167:3:169:5 | m | | -| raise.rb:168:5:168:12 | call to raise | raise.rb:167:3:169:5 | exit m (abnormal) | raise | +| raise.rb:168:5:168:12 | call to raise | raise.rb:167:3:169:5 | exit m (abnormal) | exception | | raise.rb:168:5:168:12 | self | raise.rb:168:11:168:12 | "" | | | raise.rb:168:11:168:12 | "" | raise.rb:168:5:168:12 | call to raise | | | raise.rb:172:1:182:3 | enter m16 | raise.rb:172:9:172:10 | b1 | | @@ -2373,19 +2373,19 @@ | raise.rb:174:8:174:9 | b1 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | | raise.rb:174:8:174:9 | b1 | raise.rb:174:14:174:15 | b2 | false | | raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:14:174:15 | b2 | raise.rb:174:20:174:23 | true | | | raise.rb:174:14:174:23 | ... == ... | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | | raise.rb:174:14:174:23 | ... == ... | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:14:174:23 | ... == ... | raise.rb:179:10:179:19 | ExceptionA | raise | +| raise.rb:174:14:174:23 | ... == ... | raise.rb:179:10:179:19 | ExceptionA | exception | | raise.rb:174:20:174:23 | true | raise.rb:174:14:174:23 | ... == ... | | | raise.rb:175:7:175:14 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | | raise.rb:175:14:175:14 | 1 | raise.rb:175:7:175:14 | return | | | raise.rb:177:7:177:14 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | | raise.rb:177:14:177:14 | 2 | raise.rb:177:7:177:14 | return | | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | raise | +| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | exception | | raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | | raise.rb:180:5:180:12 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | | raise.rb:180:12:180:12 | 3 | raise.rb:180:5:180:12 | return | | diff --git a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected index 2bc683f894e4..54cf1d085433 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -1,10 +1,10 @@ callsWithNoArguments -| break_ensure.rb:8:6:8:13 | [ensure: raise] call to elements | +| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | break_ensure.rb:8:6:8:13 | call to elements | -| break_ensure.rb:8:6:8:18 | [ensure: raise] call to nil? | +| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | break_ensure.rb:8:6:8:18 | call to nil? | | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | -| break_ensure.rb:20:10:20:15 | [ensure: raise] call to nil? | +| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | break_ensure.rb:20:10:20:15 | call to nil? | | break_ensure.rb:29:8:29:13 | call to nil? | | case.rb:2:8:2:9 | call to x1 | @@ -72,25 +72,25 @@ callsWithNoArguments positionalArguments | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:13:2:13 | 0 | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:12:3:12 | 0 | -| break_ensure.rb:9:5:9:23 | [ensure: raise] call to puts | break_ensure.rb:9:10:9:23 | [ensure: raise] "elements nil" | +| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:9:10:9:23 | "elements nil" | | break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:13:14:13 | 0 | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:14:16:14 | 0 | | break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | -| break_ensure.rb:21:9:21:20 | [ensure: raise] call to puts | break_ensure.rb:21:14:21:20 | [ensure: raise] "y nil" | +| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:21:14:21:20 | "y nil" | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:15:33:15 | 0 | -| break_ensure.rb:33:11:33:15 | [ensure: raise] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: raise] 0 | +| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:16:35:16 | 0 | -| break_ensure.rb:35:12:35:16 | [ensure: raise] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: raise] 0 | +| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:41:8:41:13 | "Done" | | break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:13:45:13 | 0 | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:14:47:14 | 1 | | break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:48:15:48:16 | "" | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:14:51:14 | 0 | -| break_ensure.rb:51:10:51:14 | [ensure: raise] ... > ... | break_ensure.rb:51:14:51:14 | [ensure: raise] 0 | +| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | case.rb:3:29:3:37 | call to puts | case.rb:3:34:3:37 | "x2" | | case.rb:4:17:4:24 | call to puts | case.rb:4:22:4:24 | "2" | | case.rb:14:13:14:18 | ... == ... | case.rb:14:18:14:18 | 5 | @@ -319,7 +319,7 @@ positionalArguments | raise.rb:70:5:70:17 | call to raise | raise.rb:70:11:70:17 | "x > 2" | | raise.rb:71:9:71:13 | ... < ... | raise.rb:71:13:71:13 | 0 | | raise.rb:74:3:74:20 | call to puts | raise.rb:74:8:74:20 | "0 <= x <= 2" | -| raise.rb:76:3:76:15 | [ensure: raise] call to puts | raise.rb:76:8:76:15 | [ensure: raise] "ensure" | +| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | | raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | raise.rb:76:3:76:15 | call to puts | raise.rb:76:8:76:15 | "ensure" | | raise.rb:80:3:80:17 | call to puts | raise.rb:80:8:80:17 | "Begin m8" | @@ -327,7 +327,7 @@ positionalArguments | raise.rb:83:7:83:19 | call to raise | raise.rb:83:13:83:19 | "x > 2" | | raise.rb:84:11:84:15 | ... < ... | raise.rb:84:15:84:15 | 0 | | raise.rb:87:5:87:22 | call to puts | raise.rb:87:10:87:22 | "0 <= x <= 2" | -| raise.rb:89:5:89:17 | [ensure: raise] call to puts | raise.rb:89:10:89:17 | [ensure: raise] "ensure" | +| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | | raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | raise.rb:89:5:89:17 | call to puts | raise.rb:89:10:89:17 | "ensure" | | raise.rb:91:3:91:15 | call to puts | raise.rb:91:8:91:15 | "End m8" | @@ -336,30 +336,30 @@ positionalArguments | raise.rb:98:7:98:19 | call to raise | raise.rb:98:13:98:19 | "x > 2" | | raise.rb:99:11:99:15 | ... < ... | raise.rb:99:15:99:15 | 0 | | raise.rb:102:5:102:22 | call to puts | raise.rb:102:10:102:22 | "0 <= x <= 2" | -| raise.rb:104:5:104:23 | [ensure: raise] call to puts | raise.rb:104:10:104:23 | [ensure: raise] "outer ensure" | +| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | | raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | raise.rb:104:5:104:23 | call to puts | raise.rb:104:10:104:23 | "outer ensure" | -| raise.rb:107:9:107:26 | [ensure: raise] call to raise | raise.rb:107:15:107:26 | [ensure: raise] "b1 is true" | +| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | | raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | raise.rb:107:9:107:26 | call to raise | raise.rb:107:15:107:26 | "b1 is true" | -| raise.rb:110:7:110:25 | [ensure(1): raise] call to puts | raise.rb:110:12:110:25 | [ensure(1): raise] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: raise, ensure(1): raise] call to puts | raise.rb:110:12:110:25 | [ensure: raise, ensure(1): raise] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: raise] call to puts | raise.rb:110:12:110:25 | [ensure: raise] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): raise] call to puts | raise.rb:110:12:110:25 | [ensure: return, ensure(1): raise] "inner ensure" | +| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | +| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | +| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | +| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | | raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | raise.rb:110:7:110:25 | call to puts | raise.rb:110:12:110:25 | "inner ensure" | | raise.rb:113:3:113:15 | call to puts | raise.rb:113:8:113:15 | "End m9" | -| raise.rb:115:3:115:22 | [ensure: raise] call to puts | raise.rb:115:8:115:22 | [ensure: raise] "method ensure" | +| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | | raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | raise.rb:115:3:115:22 | call to puts | raise.rb:115:8:115:22 | "method ensure" | -| raise.rb:117:5:117:22 | [ensure: raise] call to raise | raise.rb:117:11:117:22 | [ensure: raise] "b2 is true" | +| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | | raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | raise.rb:117:5:117:22 | call to raise | raise.rb:117:11:117:22 | "b2 is true" | | raise.rb:121:14:121:30 | call to raise | raise.rb:121:20:121:30 | "Exception" | | raise.rb:125:3:125:51 | call to puts | raise.rb:125:8:125:51 | "Will not get executed if p is..." | | raise.rb:131:7:131:22 | call to raise | raise.rb:131:13:131:22 | ExceptionA | | raise.rb:135:5:135:21 | call to puts | raise.rb:135:10:135:21 | "ExceptionB" | -| raise.rb:137:5:137:17 | [ensure: raise] call to puts | raise.rb:137:10:137:17 | [ensure: raise] "Ensure" | +| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | raise.rb:137:5:137:17 | call to puts | raise.rb:137:10:137:17 | "Ensure" | | raise.rb:139:3:139:16 | call to puts | raise.rb:139:8:139:16 | "End m11" | | raise.rb:144:5:144:12 | call to raise | raise.rb:144:11:144:12 | "" | diff --git a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql index 1bf7461e7fac..86609a73909c 100644 --- a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql +++ b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql @@ -12,7 +12,7 @@ query predicate newStyleBarrierGuards(DataFlow::Node n) { n instanceof StringConstArrayInclusionCallBarrier } -query predicate controls(CfgNode condition, BasicBlock bb, SuccessorTypes::ConditionalSuccessor s) { +query predicate controls(CfgNode condition, BasicBlock bb, ConditionalSuccessor s) { exists(ConditionBlock cb | cb.edgeDominates(bb, s) and condition = cb.getLastNode() diff --git a/ruby/ql/test/query-tests/experimental/InsecureRandomness/InsecureRandomness.rb b/ruby/ql/test/query-tests/experimental/InsecureRandomness/InsecureRandomness.rb index 516b282ece55..116957137b56 100644 --- a/ruby/ql/test/query-tests/experimental/InsecureRandomness/InsecureRandomness.rb +++ b/ruby/ql/test/query-tests/experimental/InsecureRandomness/InsecureRandomness.rb @@ -2,7 +2,7 @@ def generate_password_1(length) chars = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a + ['!', '@', '#', '$', '%'] - # BAD: rand is not cryptographically secure + # BAD: rand is not cryptographically secure password = (1..length).collect { chars[rand(chars.size)] }.join end diff --git a/ruby/ql/test/query-tests/security/cwe-915/test.rb b/ruby/ql/test/query-tests/security/cwe-915/test.rb index a60def5d201f..c72ad536ef73 100644 --- a/ruby/ql/test/query-tests/security/cwe-915/test.rb +++ b/ruby/ql/test/query-tests/security/cwe-915/test.rb @@ -46,7 +46,7 @@ def user_params def create4 x = params[:user] x.permit! - User.new(x) # BAD + User.new(x) # BAD User.new(x.permit(:name,:address)) # GOOD User.new(params.permit(user: {})) # BAD User.new(params.permit(user: [:name, :address, {friends:{}}])) # BAD diff --git a/rust/README.md b/rust/README.md index 4f462f1b70f6..4fdbb0aedbdd 100644 --- a/rust/README.md +++ b/rust/README.md @@ -59,3 +59,54 @@ Sometimes, especially if resolving conflicts on generated files, you might need bazel run @codeql//rust/codegen -- --force ``` for code generation to succeed. + +### Updating `rust-analyzer` + +Here's a rundown of the typical actions to perform to do a rust-analyzer (and other dependencies) update. A one-time setup consists in +installing [`cargo-edit`](https://crates.io/crates/cargo-edit) with `cargo install cargo-edit`. On Ubuntu that also requires +`sudo apt install libssl-dev pkg-config`. + +1. From the root of the `codeql` repo checkout, run a Cargo upgrade: + ``` + cargo upgrade --incompatible --pinned + ``` +2. Look at a diff of the `Cargo.toml` files: if all `ra_ap_` prefixed dependencies have been updated to the same number, go on to the next step. + Otherwise, it means the latest `rust-analyzer` update has not been fully rolled out to all its crates in `crates.io`. + _All `ra_ap_` versions must agree!_ + Downgrade by hand to the minimum one you see, and run a `cargo update` after that to fix the `Cargo.lock` file. +3. Commit the changes, skipping `pre-commit` hooks if you have them enabled: + ``` + git commit -am 'Cargo: upgrade dependencies' --no-verify + ``` +4. Regenerate vendored bazel files (these allow faster builds, particularly on CI where it has to start from scratch each time), commit the changes: + ``` + misc/bazel/3rdparty/update_tree_sitter_extractors_deps.sh + git add . + git commit -am 'Bazel: regenerate vendored cargo dependencies' --no-verify + ``` +5. Run codegen + ``` + bazel run //rust/codegen + ``` + Take note whether `rust/schema/ast.py` was changed. That might need tweaks, new tests and/or downgrade/upgrade scripts down the line. +6. Try compiling + ``` + bazel run //rust:install + ``` + * if it succeeds: good! You can move on to the next step. + * if it fails while compiling rust-analyzer dependencies, you need to update the rust toolchain. Sometimes the error will tell you + so explicitly, but it may happen that the error is more obscure. To update the rust toolchain: + * you will need to open a PR on the internal repo updating `RUST_VERSION` in `MODULE.bazel`. In general you can have this merged + independently of the changes in `codeql`. + * in `codeql`, update both `RUST_VERSION` in `MODULE.bazel` _and_ `rust-toolchain.toml` files. You may want to also update the + nightly toolchain in `rust/extractor/src/nightly-toolchain/rust-toolchain.toml` to a more recent date while you're at it. + * if it fails while compiling rust extractor code, you will need to adapt it to the new library version. + * for example updating annotations in `annotations.py`, adding / removing generated tests. + + If you had to do any changes, commit them. If you updated the rust toolchain, running `rust/lint.py` might reformat or apply new + lints to the code. +7. Check with CI if everything is in order. +8. Run DCA with database caching disabled. Iterate on the code if needed. +9. If in step 5 the schema was updated, add upgrade/downgrade scripts and a change note. This is best done last to reduce the chance of +merge conflicts (none of the other testing depends on having upgrade and downgrade scripts in place). See +[Upgrading a language database schema](docs/prepare-db-upgrade.md). diff --git a/rust/ql/.generated.list b/rust/ql/.generated.list index 23a5b4fabf05..92d0a7a4cd84 100644 --- a/rust/ql/.generated.list +++ b/rust/ql/.generated.list @@ -419,9 +419,7 @@ lib/codeql/rust/elements/internal/TypeAliasConstructor.qll 048caa79eb7d400971e3e lib/codeql/rust/elements/internal/TypeArgConstructor.qll 51d621e170fdf5f91497f8cc8c1764ce8a59fde5a2b9ecfad17ce826a96c56c4 a5bbb329bde456a40ffa84a325a4be1271dbde842c1573d1beb7056c8fb0f681 lib/codeql/rust/elements/internal/TypeArgImpl.qll 77886af8b2c045463c4c34d781c8f618eec5f5143098548047730f73c7e4a34a 6be6c519b71f9196e0559958e85efe8a78fbce7a90ca2401d7c402e46bc865c9 lib/codeql/rust/elements/internal/TypeBoundConstructor.qll ba99616e65cf2811187016ff23e5b0005cfd0f1123622e908ff8b560aaa5847f fde78432b55b31cf68a3acb7093256217df37539f942c4441d1b1e7bf9271d89 -lib/codeql/rust/elements/internal/TypeBoundImpl.qll 7274dc0307595f7431343d7542b9441362087bcb1115b21bc5ffa02f2d3dd678 257cad7cd2658cf707ee9ae2bb99a4c7e3e51e6c237d272f3058571f1e5cb133 lib/codeql/rust/elements/internal/TypeBoundListConstructor.qll 4b634b3a4ca8909ce8c0d172d9258168c5271435474089902456c2e3e47ae1c5 3af74623ced55b3263c096810a685517d36b75229431b81f3bb8101294940025 -lib/codeql/rust/elements/internal/TypeBoundListImpl.qll 5641aca40c0331899f4291188e60945eb2a01679e3b33883053309fb3823d9ab c84bb1daa7c10f3bb634a179957934d7ae1bef1380fcd8a9c734004625575485 lib/codeql/rust/elements/internal/TypeParamConstructor.qll a6e57cccd6b54fa68742d7b8ce70678a79ac133ea8c1bfa89d60b5f74ad07e05 0e5f45d250d736aaf40387be22e55288543bdb55bbb20ecb43f2f056e8be8b09 lib/codeql/rust/elements/internal/TypeReprImpl.qll 504b137313407be57c93fe0acee31716a02f91e23ce417e7c67bae2ae9937564 28fa8b680d5cd782c5c5fb048a9deb9b9debd196e3bc7df1129843e61eb342ea lib/codeql/rust/elements/internal/UnderscoreExprConstructor.qll 8dc27831adb49c1a47b9f8997d6065e82b4e48e41e3c35bd8d35255cea459905 6c5a5272d37f83f1c1b17475f8adb7d867e95025d201320e20a32dab1f69f7bf diff --git a/rust/ql/.gitattributes b/rust/ql/.gitattributes index 71cd100d3f2e..19f5c2842403 100644 --- a/rust/ql/.gitattributes +++ b/rust/ql/.gitattributes @@ -421,9 +421,7 @@ /lib/codeql/rust/elements/internal/TypeArgConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeArgImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeBoundConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TypeBoundImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeBoundListConstructor.qll linguist-generated -/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll linguist-generated /lib/codeql/rust/elements/internal/TypeParamConstructor.qll linguist-generated /lib/codeql/rust/elements/internal/TypeReprImpl.qll linguist-generated /lib/codeql/rust/elements/internal/UnderscoreExprConstructor.qll linguist-generated diff --git a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected index b89c6ba94af9..b601905e6a30 100644 --- a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected @@ -19,6 +19,7 @@ ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql +ql/rust/ql/src/queries/security/CWE-918/RequestForgery.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql ql/rust/ql/src/queries/summary/LinesOfUserCode.ql ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected index 5e1aecfab6e9..074cb2ec8888 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected @@ -22,6 +22,7 @@ ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql +ql/rust/ql/src/queries/security/CWE-918/RequestForgery.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql ql/rust/ql/src/queries/summary/LinesOfUserCode.ql ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected index 88c07796c095..38846e281eb8 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected @@ -21,6 +21,7 @@ ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql ql/rust/ql/src/queries/security/CWE-798/HardcodedCryptographicValue.ql ql/rust/ql/src/queries/security/CWE-825/AccessAfterLifetime.ql ql/rust/ql/src/queries/security/CWE-825/AccessInvalidPointer.ql +ql/rust/ql/src/queries/security/CWE-918/RequestForgery.ql ql/rust/ql/src/queries/summary/LinesOfCode.ql ql/rust/ql/src/queries/summary/LinesOfUserCode.ql ql/rust/ql/src/queries/summary/NodesWithTypeAtLengthLimit.ql diff --git a/rust/ql/lib/CHANGELOG.md b/rust/ql/lib/CHANGELOG.md index 6ff2f1072c71..809479e5fec4 100644 --- a/rust/ql/lib/CHANGELOG.md +++ b/rust/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 0.1.16 + +### Minor Analysis Improvements + +* Added cryptography related models for the `cookie` and `biscotti` crates. + ## 0.1.15 ### Major Analysis Improvements diff --git a/rust/ql/lib/change-notes/released/0.1.16.md b/rust/ql/lib/change-notes/released/0.1.16.md new file mode 100644 index 000000000000..eb630642345d --- /dev/null +++ b/rust/ql/lib/change-notes/released/0.1.16.md @@ -0,0 +1,5 @@ +## 0.1.16 + +### Minor Analysis Improvements + +* Added cryptography related models for the `cookie` and `biscotti` crates. diff --git a/rust/ql/lib/codeql-pack.release.yml b/rust/ql/lib/codeql-pack.release.yml index 747196347438..a01dca921616 100644 --- a/rust/ql/lib/codeql-pack.release.yml +++ b/rust/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.15 +lastReleaseVersion: 0.1.16 diff --git a/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll b/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll index daa2cb1e818b..4ed935440234 100644 --- a/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll +++ b/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll @@ -21,8 +21,6 @@ final class JoinPredecessorBasicBlock = BasicBlocksImpl::JoinPredecessorBasicBlo module Cfg implements BB::CfgSig { class ControlFlowNode = ControlFlowGraph::CfgNode; - class SuccessorType = ControlFlowGraph::SuccessorType; - class BasicBlock = BasicBlocksImpl::BasicBlock; class EntryBasicBlock = BasicBlocksImpl::EntryBasicBlock; diff --git a/rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll b/rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll index eb8dbdea39f7..b586a1aafee4 100644 --- a/rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll +++ b/rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll @@ -1,25 +1,9 @@ /** Provides classes representing the control flow graph. */ private import internal.ControlFlowGraphImpl -private import internal.SuccessorType private import internal.Scope as Scope +import codeql.controlflow.SuccessorType final class CfgScope = Scope::CfgScope; -final class SuccessorType = SuccessorTypeImpl; - -final class NormalSuccessor = NormalSuccessorImpl; - -final class ConditionalSuccessor = ConditionalSuccessorImpl; - -final class BooleanSuccessor = BooleanSuccessorImpl; - -final class MatchSuccessor = MatchSuccessorImpl; - -final class BreakSuccessor = BreakSuccessorImpl; - -final class ContinueSuccessor = ContinueSuccessorImpl; - -final class ReturnSuccessor = ReturnSuccessorImpl; - final class CfgNode = Node; diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll b/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll index 01169ce2727a..0250f1cbc435 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll @@ -1,7 +1,6 @@ private import codeql.util.Boolean private import codeql.rust.controlflow.ControlFlowGraph private import rust -private import SuccessorType newtype TCompletion = TSimpleCompletion() or @@ -32,7 +31,7 @@ abstract class NormalCompletion extends Completion { } /** A simple (normal) completion. */ class SimpleCompletion extends NormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } // `SimpleCompletion` is the "default" completion type, thus it is valid for // any node where there isn't another more specific completion type. @@ -184,7 +183,7 @@ class MatchCompletion extends TMatchCompletion, ConditionalCompletion { e instanceof TryExpr and value = true } - override MatchSuccessor getAMatchingSuccessorType() { result.getValue() = value } + override MatchingSuccessor getAMatchingSuccessorType() { result.getValue() = value } /** Gets the dual match completion. */ override MatchCompletion getDual() { result = TMatchCompletion(value.booleanNot()) } diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll index e989931e0698..ddc4dae9b958 100644 --- a/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll +++ b/rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll @@ -29,19 +29,11 @@ private module CfgInput implements InputSig { Stages::CfgStage::ref() } - class SuccessorType = Cfg::SuccessorType; + private class SuccessorType = Cfg::SuccessorType; /** Gets a successor type that matches completion `c`. */ SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - /** - * Hold if `c` represents simple (normal) evaluation of a statement or an expression. - */ - predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::NormalSuccessor } - - /** Holds if `t` is an abnormal exit type out of a CFG scope. */ - predicate isAbnormalExitType(SuccessorType t) { none() } - /** Hold if `t` represents a conditional successor type. */ predicate successorTypeIsCondition(SuccessorType t) { t instanceof Cfg::BooleanSuccessor } diff --git a/rust/ql/lib/codeql/rust/controlflow/internal/SuccessorType.qll b/rust/ql/lib/codeql/rust/controlflow/internal/SuccessorType.qll deleted file mode 100644 index 658d2a667061..000000000000 --- a/rust/ql/lib/codeql/rust/controlflow/internal/SuccessorType.qll +++ /dev/null @@ -1,74 +0,0 @@ -private import rust -private import codeql.util.Boolean -private import Completion -private import codeql.rust.internal.CachedStages - -cached -newtype TSuccessorType = - TNormalSuccessor() { Stages::CfgStage::ref() } or - TBooleanSuccessor(Boolean b) or - TMatchSuccessor(Boolean b) or - TBreakSuccessor() or - TContinueSuccessor() or - TReturnSuccessor() - -/** The type of a control flow successor. */ -abstract class SuccessorTypeImpl extends TSuccessorType { - /** Gets a textual representation of successor type. */ - abstract string toString(); -} - -/** A normal control flow successor. */ -class NormalSuccessorImpl extends SuccessorTypeImpl, TNormalSuccessor { - override string toString() { result = "successor" } -} - -/** A conditional control flow successor. */ -abstract class ConditionalSuccessorImpl extends SuccessorTypeImpl { - boolean value; - - bindingset[value] - ConditionalSuccessorImpl() { exists(value) } - - /** Gets the Boolean value of this successor. */ - boolean getValue() { result = value } -} - -/** A Boolean control flow successor for a boolean conditon. */ -class BooleanSuccessorImpl extends ConditionalSuccessorImpl, TBooleanSuccessor { - BooleanSuccessorImpl() { this = TBooleanSuccessor(value) } - - override string toString() { result = this.getValue().toString() } -} - -/** - * A control flow successor of a pattern match. - */ -class MatchSuccessorImpl extends ConditionalSuccessorImpl, TMatchSuccessor { - MatchSuccessorImpl() { this = TMatchSuccessor(value) } - - override string toString() { - if this.getValue() = true then result = "match" else result = "no-match" - } -} - -/** - * A control flow successor of a `break` expression. - */ -class BreakSuccessorImpl extends SuccessorTypeImpl, TBreakSuccessor { - override string toString() { result = "break" } -} - -/** - * A control flow successor of a `continue` expression. - */ -class ContinueSuccessorImpl extends SuccessorTypeImpl, TContinueSuccessor { - override string toString() { result = "continue" } -} - -/** - * A `return` control flow successor. - */ -class ReturnSuccessorImpl extends SuccessorTypeImpl, TReturnSuccessor { - override string toString() { result = "return" } -} diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index 9ab04c7d0402..eca3a473c06f 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -21,7 +21,6 @@ private import Node private import Content private import FlowSummaryImpl as FlowSummaryImpl - /** * A return kind. A return kind describes how a value can be returned from a * callable. @@ -54,11 +53,9 @@ final class DataFlowCallable extends TDataFlowCallable { } /** Gets the location of this callable. */ - Location getLocation() { result = this.asCfgScope().getLocation() } - - //** TODO JB1: Move to subclass, monkey patching for #153 */ - int totalorder(){ none() } - //** TODO JB1: end stubs for #153 */ + Location getLocation() { + result = [this.asCfgScope().getLocation(), this.asSummarizedCallable().getLocation()] + } } final class DataFlowCall extends TDataFlowCall { @@ -88,12 +85,6 @@ final class DataFlowCall extends TDataFlowCall { ) } - //** TODO JB1: Move to subclass, monkey patching for #153 */ - DataFlowCallable getARuntimeTarget(){ none() } - ArgumentNode getAnArgumentNode(){ none() } - int totalorder(){ none() } - //** TODO JB1: end stubs for #153 */ - Location getLocation() { result = this.asCallCfgNode().getLocation() } } @@ -207,7 +198,8 @@ private ExprCfgNode getALastEvalNode(ExprCfgNode e) { /** * Holds if a reverse local flow step should be added from the post-update node - * for `e` to the post-update node for the result. + * for `e` to the post-update node for the result. `preservesValue` is true + * if the step is value preserving. * * This is needed to allow for side-effects on compound expressions to propagate * to sub components. For example, in @@ -774,10 +766,6 @@ module RustDataFlow implements InputSig { string toString() { result = "NodeRegion" } predicate contains(Node n) { none() } - - //** TODO JB1: Move to subclass, monkey patching for #153 */ - int totalOrder(){ none() } - //** TODO JB1: end stubs for #153 */ } /** @@ -1081,4 +1069,4 @@ private module Cached { } } -import Cached +import Cached \ No newline at end of file diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll index 7f8df8d144ba..067ef98b2fc0 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/ModelsAsData.qll @@ -51,7 +51,8 @@ private import codeql.rust.elements.internal.CallExprBaseImpl::Impl as CallExprB /** * Holds if in a call to the function with canonical path `path`, the value referred - * to by `output` is a flow source of the given `kind`. + * to by `output` is a flow source of the given `kind` and `madId` is the data + * extension row number. * * `output = "ReturnValue"` simply means the result of the call itself. * @@ -64,7 +65,8 @@ extensible predicate sourceModel( /** * Holds if in a call to the function with canonical path `path`, the value referred - * to by `input` is a flow sink of the given `kind`. + * to by `input` is a flow sink of the given `kind` and `madId` is the data + * extension row number. * * For example, `input = Argument[0]` means the first argument of the call. * @@ -77,7 +79,8 @@ extensible predicate sinkModel( /** * Holds if in a call to the function with canonical path `path`, the value referred - * to by `input` can flow to the value referred to by `output`. + * to by `input` can flow to the value referred to by `output` and `madId` is the data + * extension row number. * * `kind` should be either `value` or `taint`, for value-preserving or taint-preserving * steps, respectively. diff --git a/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll index ac6e08bb9cf7..020b50594a6d 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/CallImpl.qll @@ -123,11 +123,10 @@ module Impl { } class CallExprMethodCall extends Call instanceof CallExpr { - Path qualifier; string methodName; boolean selfIsRef; - CallExprMethodCall() { callIsMethodCall(this, qualifier, methodName, selfIsRef) } + CallExprMethodCall() { callIsMethodCall(this, _, methodName, selfIsRef) } /** * Holds if this call must have an explicit borrow for the `self` argument, diff --git a/rust/ql/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll index a4e3ac7a5c39..24b4852d7289 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/ImplTraitTypeReprImpl.qll @@ -36,5 +36,9 @@ module Impl { predicate isInReturnPos() { exists(Function f | f.getRetType().getTypeRepr() = this.getFunctionTypeRepr(f)) } + + override string toStringImpl() { + result = "impl " + this.getTypeBoundList().toAbbreviatedString() + } } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll index 1825cf5804d5..0623effa9c2f 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll @@ -22,7 +22,9 @@ module Impl { * ``` */ class Lifetime extends Generated::Lifetime { - override string toStringImpl() { + override string toStringImpl() { result = this.toAbbreviatedString() } + + override string toAbbreviatedString() { result = this.getText() or not this.hasText() and result = "'_" diff --git a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll index 5dd87536a03e..cf05bbc4adad 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TypeBound`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.TypeBound * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A type bound in a trait or generic parameter. * @@ -23,5 +23,12 @@ module Impl { * // ^^^^^^^^^^^^^^^^^^^^^ * ``` */ - class TypeBound extends Generated::TypeBound { } + class TypeBound extends Generated::TypeBound { + override string toAbbreviatedString() { + result = this.getLifetime().toAbbreviatedString() + or + not this.hasLifetime() and + result = "..." + } + } } diff --git a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll index 1b6fd0e64fed..0d386b6edb05 100644 --- a/rust/ql/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll +++ b/rust/ql/lib/codeql/rust/elements/internal/TypeBoundListImpl.qll @@ -1,4 +1,3 @@ -// generated by codegen, remove this comment if you wish to edit this file /** * This module provides a hand-modifiable wrapper around the generated class `TypeBoundList`. * @@ -12,6 +11,7 @@ private import codeql.rust.elements.internal.generated.TypeBoundList * be referenced directly. */ module Impl { + // the following QLdoc is generated: if you need to edit it, do it in the schema file /** * A list of type bounds. * @@ -21,5 +21,15 @@ module Impl { * // ^^^^^^^^^^^^^ * ``` */ - class TypeBoundList extends Generated::TypeBoundList { } + class TypeBoundList extends Generated::TypeBoundList { + override string toStringImpl() { result = this.toAbbreviatedString() } + + private string toAbbreviatedStringPart(int index) { + result = this.getBound(index).toAbbreviatedString() + } + + override string toAbbreviatedString() { + result = strictconcat(int i | | this.toAbbreviatedStringPart(i), " + " order by i) + } + } } diff --git a/rust/ql/lib/codeql/rust/frameworks/biscotti.model.yml b/rust/ql/lib/codeql/rust/frameworks/biscotti.model.yml new file mode 100644 index 000000000000..c99a2433348a --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/biscotti.model.yml @@ -0,0 +1,7 @@ +# Models for the `biscotti` crate. +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["::from", "Argument[0]", "credentials-key", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/cookie.model.yml b/rust/ql/lib/codeql/rust/frameworks/cookie.model.yml new file mode 100644 index 000000000000..abbadd379e6e --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/cookie.model.yml @@ -0,0 +1,7 @@ +# Models for the `cookie` crate. +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + - ["::from", "Argument[0].Reference", "credentials-key", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/reqwest.model.yml b/rust/ql/lib/codeql/rust/frameworks/reqwest.model.yml index 8c24bbf148df..5457460919f2 100644 --- a/rust/ql/lib/codeql/rust/frameworks/reqwest.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/reqwest.model.yml @@ -9,8 +9,8 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["::request", "Argument[1]", "transmission", "manual"] - - ["::request", "Argument[1]", "transmission", "manual"] + - ["::request", "Argument[1]", "request-url", "manual"] + - ["::request", "Argument[1]", "request-url", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml index 848bb22a5baf..79b0b16f41e2 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/fs.model.yml @@ -45,7 +45,6 @@ extensions: data: - ["std::fs::canonicalize", "Argument[0].OptionalStep[normalize-path]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["std::fs::canonicalize", "Argument[0].OptionalBarrier[normalize-path]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["::from", "Argument[0]", "ReturnValue", "value", "manual"] - ["::as_path", "Argument[Self]", "ReturnValue.Reference", "value", "manual"] - ["::as_mut_os_string", "Argument[Self].Reference", "ReturnValue.Reference", "value", "manual"] - ["::into_os_string", "Argument[Self]", "ReturnValue", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-alloc.model.yml index 08fd458576d6..8eb3788ab1ef 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-alloc.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-alloc.model.yml @@ -46,4 +46,5 @@ extensions: - ["::to_string", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::parse", "Argument[self]", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::trim", "Argument[self]", "ReturnValue.Reference", "taint", "manual"] - - ["::from", "Argument[0]", "ReturnValue", "value", "manual"] + # Vec + - ["alloc::vec::from_elem", "Argument[0]", "ReturnValue.Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml index 46cf9e64e248..a92ed8fc2356 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/lang-core.model.yml @@ -11,6 +11,8 @@ extensions: - ["<_ as core::convert::Into>::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] - ["::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] - ["::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] + # From + - ["<_ as core::convert::From>::from", "Argument[0]", "ReturnValue", "value", "manual"] # Iterator - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/internal/CachedStages.qll b/rust/ql/lib/codeql/rust/internal/CachedStages.qll index c2dc21661783..cfd3d6905220 100644 --- a/rust/ql/lib/codeql/rust/internal/CachedStages.qll +++ b/rust/ql/lib/codeql/rust/internal/CachedStages.qll @@ -65,7 +65,6 @@ module Stages { cached module CfgStage { private import codeql.rust.controlflow.internal.Splitting - private import codeql.rust.controlflow.internal.SuccessorType private import codeql.rust.controlflow.internal.ControlFlowGraphImpl private import codeql.rust.controlflow.CfgNodes @@ -87,8 +86,6 @@ module Stages { or exists(TConditionalCompletionSplitKind()) or - exists(TNormalSuccessor()) - or exists(AstCfgNode n) or exists(CallExprCfgNode n | exists(n.getFunction())) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 77faaa747b96..4b718fc43998 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -648,6 +648,18 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { override Visibility getVisibility() { result = Impl.super.getVisibility() } + TypeParamItemNode getBlanketImplementationTypeParam() { + result = this.resolveSelfTy() and + // This impl block is not superseded by the expansion of an attribute macro. + not exists(super.getAttributeMacroExpansion()) + } + + /** + * Holds if this impl block is a blanket implementation. That is, the + * implementation targets a generic parameter of the impl block. + */ + predicate isBlanketImplementation() { exists(this.getBlanketImplementationTypeParam()) } + override predicate hasCanonicalPath(Crate c) { this.resolveSelfTy().hasCanonicalPathPrefix(c) } /** @@ -1006,6 +1018,14 @@ final class TypeParamItemNode extends TypeItemNode instanceof TypeParam { Path getABoundPath() { result = this.getTypeBoundAt(_, _).getTypeRepr().(PathTypeRepr).getPath() } pragma[nomagic] + ItemNode resolveBound(int index) { + result = + rank[index + 1](int i, int j | + | + resolvePath(this.getTypeBoundAt(i, j).getTypeRepr().(PathTypeRepr).getPath()) order by i, j + ) + } + ItemNode resolveABound() { result = resolvePath(this.getABoundPath()) } /** diff --git a/rust/ql/lib/codeql/rust/internal/Type.qll b/rust/ql/lib/codeql/rust/internal/Type.qll index 56c179354b40..eaa7e83fc6da 100644 --- a/rust/ql/lib/codeql/rust/internal/Type.qll +++ b/rust/ql/lib/codeql/rust/internal/Type.qll @@ -620,9 +620,7 @@ final class TypeBoundTypeAbstraction extends TypeAbstraction, TypeBound { } final class SelfTypeBoundTypeAbstraction extends TypeAbstraction, Name { - private TraitTypeAbstraction trait; - - SelfTypeBoundTypeAbstraction() { trait.getName() = this } + SelfTypeBoundTypeAbstraction() { any(TraitTypeAbstraction trait).getName() = this } override TypeParameter getATypeParameter() { none() } } diff --git a/rust/ql/lib/codeql/rust/internal/TypeInference.qll b/rust/ql/lib/codeql/rust/internal/TypeInference.qll index 956eb63820aa..16c0b30332ef 100644 --- a/rust/ql/lib/codeql/rust/internal/TypeInference.qll +++ b/rust/ql/lib/codeql/rust/internal/TypeInference.qll @@ -226,7 +226,13 @@ module Consistency { predicate nonUniqueCertainType(AstNode n, TypePath path, Type t) { strictcount(CertainTypeInference::inferCertainType(n, path)) > 1 and - t = CertainTypeInference::inferCertainType(n, path) + t = CertainTypeInference::inferCertainType(n, path) and + // Suppress the inconsistency if `n` is a self parameter and the type + // mention for the self type has multiple types for a path. + not exists(ImplItemNode impl, TypePath selfTypePath | + n = impl.getAnAssocItem().(Function).getParamList().getSelfParam() and + strictcount(impl.(Impl).getSelfTy().(TypeMention).resolveTypeAt(selfTypePath)) > 1 + ) } } @@ -250,14 +256,66 @@ private TypeMention getTypeAnnotation(AstNode n) { ) } +/** + * Gets the type of the implicitly typed `self` parameter, taking into account + * whether the parameter is passed by value or by reference. + */ +bindingset[self, suffix, t] +pragma[inline_late] +private Type getRefAdjustShorthandSelfType(SelfParam self, TypePath suffix, Type t, TypePath path) { + not self.hasTypeRepr() and + ( + if self.isRef() + then + // `fn f(&self, ...)` + path.isEmpty() and + result = TRefType() + or + path = TypePath::cons(TRefTypeParameter(), suffix) and + result = t + else ( + // `fn f(self, ...)` + path = suffix and + result = t + ) + ) +} + +pragma[nomagic] +private Type resolveImplSelfType(Impl i, TypePath path) { + result = i.getSelfTy().(TypeMention).resolveTypeAt(path) +} + +/** + * Gets the type at `path` of the parameter `self` which uses the [shorthand + * syntax][1] which is sugar for an explicit annotation. + * + * [1]: https://doc.rust-lang.org/stable/reference/items/associated-items.html#r-associated.fn.method.self-pat-shorthands + */ +pragma[nomagic] +private Type inferShorthandSelfType(SelfParam self, TypePath path) { + exists(ImplOrTraitItemNode i, TypePath suffix, Type t | + self = i.getAnAssocItem().(Function).getParamList().getSelfParam() and + result = getRefAdjustShorthandSelfType(self, suffix, t, path) + | + t = resolveImplSelfType(i, suffix) + or + t = TSelfTypeParameter(i) and suffix.isEmpty() + ) +} + /** Gets the type of `n`, which has an explicit type annotation. */ pragma[nomagic] private Type inferAnnotatedType(AstNode n, TypePath path) { result = getTypeAnnotation(n).resolveTypeAt(path) + or + // The shorthand self syntax (i.e., a self parameter without a type + // annotation) is sugar for a self parameter with an annotation. + result = inferShorthandSelfType(n, path) } /** Module for inferring certain type information. */ -private module CertainTypeInference { +module CertainTypeInference { pragma[nomagic] private predicate callResolvesTo(CallExpr ce, Path p, Function f) { p = CallExprImpl::getFunctionPath(ce) and @@ -286,7 +344,7 @@ private module CertainTypeInference { } pragma[nomagic] - Type inferCertainCallExprType(CallExpr ce, TypePath path) { + private Type inferCertainCallExprType(CallExpr ce, TypePath path) { exists(Type ty, TypePath prefix, Path p | ty = getCertainCallExprType(ce, p, prefix) | exists(TypePath suffix, TypeParam tp | tp = ty.(TypeParamTypeParameter).getTypeParam() and @@ -314,6 +372,14 @@ private module CertainTypeInference { ) } + private Type inferCertainStructExprType(StructExpr se, TypePath path) { + result = se.getPath().(TypeMention).resolveTypeAt(path) + } + + private Type inferCertainStructPatType(StructPat sp, TypePath path) { + result = sp.getPath().(TypeMention).resolveTypeAt(path) + } + predicate certainTypeEquality(AstNode n1, TypePath prefix1, AstNode n2, TypePath prefix2) { prefix1.isEmpty() and prefix2.isEmpty() and @@ -369,10 +435,7 @@ private module CertainTypeInference { */ pragma[nomagic] Type inferCertainType(AstNode n, TypePath path) { - exists(TypeMention tm | - tm = getTypeAnnotation(n) and - result = tm.resolveTypeAt(path) - ) + result = inferAnnotatedType(n, path) or result = inferCertainCallExprType(n, path) or @@ -385,6 +448,10 @@ private module CertainTypeInference { or result = inferLogicalOperationType(n, path) or + result = inferCertainStructExprType(n, path) + or + result = inferCertainStructPatType(n, path) + or result = inferRangeExprType(n) and path.isEmpty() or @@ -602,50 +669,6 @@ private Type inferTypeEquality(AstNode n, TypePath path) { ) } -/** - * Gets the type of the implicitly typed `self` parameter, taking into account - * whether the parameter is passed by value or by reference. - */ -bindingset[self, suffix, t] -pragma[inline_late] -private Type getRefAdjustImplicitSelfType(SelfParam self, TypePath suffix, Type t, TypePath path) { - not self.hasTypeRepr() and - ( - if self.isRef() - then - // `fn f(&self, ...)` - path.isEmpty() and - result = TRefType() - or - path = TypePath::cons(TRefTypeParameter(), suffix) and - result = t - else ( - // `fn f(self, ...)` - path = suffix and - result = t - ) - ) -} - -pragma[nomagic] -private Type resolveImplSelfType(Impl i, TypePath path) { - result = i.getSelfTy().(TypeMention).resolveTypeAt(path) -} - -/** Gets the type at `path` of the implicitly typed `self` parameter. */ -pragma[nomagic] -private Type inferImplicitSelfType(SelfParam self, TypePath path) { - exists(ImplOrTraitItemNode i, Function f, TypePath suffix, Type t | - f = i.getAnAssocItem() and - self = f.getParamList().getSelfParam() and - result = getRefAdjustImplicitSelfType(self, suffix, t, path) - | - t = resolveImplSelfType(i, suffix) - or - t = TSelfTypeParameter(i) and suffix.isEmpty() - ) -} - /** * A matching configuration for resolving types of struct expressions * like `Foo { bar = baz }`. @@ -732,7 +755,12 @@ private module StructExprMatchingInput implements MatchingInputSig { class AccessPosition = DeclarationPosition; class Access extends StructExpr { - Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { none() } + Type getTypeArgument(TypeArgumentPosition apos, TypePath path) { + exists(TypePath suffix | + suffix.isCons(TTypeParamTypeParameter(apos.asTypeParam()), path) and + result = CertainTypeInference::inferCertainType(this, suffix) + ) + } AstNode getNodeAt(AccessPosition apos) { result = this.getFieldExpr(apos.asFieldPos()).getExpr() @@ -743,11 +771,6 @@ private module StructExprMatchingInput implements MatchingInputSig { Type getInferredType(AccessPosition apos, TypePath path) { result = inferType(this.getNodeAt(apos), path) - or - // The struct/enum type is supplied explicitly as a type qualifier, e.g. - // `Foo::Variant { ... }`. - apos.isStructPos() and - result = this.getPath().(TypeMention).resolveTypeAt(path) } Declaration getTarget() { result = resolvePath(this.getPath()) } @@ -926,11 +949,8 @@ private module CallExprBaseMatchingInput implements MatchingInputSig { or exists(SelfParam self | self = pragma[only_bind_into](this.getParamList().getSelfParam()) and - dpos.isSelf() - | + dpos.isSelf() and result = inferAnnotatedType(self, path) // `self` parameter with type annotation - or - result = inferImplicitSelfType(self, path) // `self` parameter without type annotation ) or // For associated functions, we may also need to match type arguments against @@ -1895,6 +1915,10 @@ private predicate methodCandidateTrait(Type type, Trait trait, string name, int methodCandidate(type, name, arity, impl) } +/** + * Holds if `mc` has `rootType` as the root type of the receiver and the target + * method is named `name` and has arity `arity` + */ pragma[nomagic] private predicate isMethodCall(MethodCall mc, Type rootType, string name, int arity) { rootType = mc.getTypeAt(TypePath::nil()) and @@ -1902,7 +1926,9 @@ private predicate isMethodCall(MethodCall mc, Type rootType, string name, int ar arity = mc.getNumberOfArguments() } -private module IsInstantiationOfInput implements IsInstantiationOfInputSig { +private module IsInstantiationOfInput implements + IsInstantiationOfInputSig +{ /** Holds if `mc` specifies a trait and might target a method in `impl`. */ pragma[nomagic] private predicate methodCallTraitCandidate(MethodCall mc, Impl impl) { @@ -1931,7 +1957,9 @@ private module IsInstantiationOfInput implements IsInstantiationOfInputSig::isNotInstantiationOf(mc, impl, _) + IsInstantiationOf::isNotInstantiationOf(mc, + impl, _) ) ) } pragma[nomagic] private predicate methodCallHasImplCandidate(MethodCall mc, Impl impl) { - IsInstantiationOf::isInstantiationOf(mc, impl, _) and + IsInstantiationOf::isInstantiationOf(mc, + impl, _) and if impl.hasTrait() and not exists(mc.getTrait()) then // inherent methods take precedence over trait methods, so only allow @@ -2127,6 +2157,130 @@ private predicate methodCallHasImplCandidate(MethodCall mc, Impl impl) { else any() } +private module BlanketImplementation { + private ImplItemNode getPotentialDuplicated( + string fileName, string traitName, int arity, string tpName + ) { + tpName = result.getBlanketImplementationTypeParam().getName() and + fileName = result.getLocation().getFile().getBaseName() and + traitName = result.resolveTraitTy().getName() and + arity = result.resolveTraitTy().(Trait).getNumberOfGenericParams() + } + + private predicate duplicatedImpl(Impl impl1, Impl impl2) { + exists(string fileName, string traitName, int arity, string tpName | + impl1 = getPotentialDuplicated(fileName, traitName, arity, tpName) and + impl2 = getPotentialDuplicated(fileName, traitName, arity, tpName) and + impl1.getLocation().getFile().getAbsolutePath() < + impl2.getLocation().getFile().getAbsolutePath() + ) + } + + /** + * Holds if `impl` is a canonical blanket implementation. + * + * Libraries can often occur several times in the database for different + * library versions. This causes the same blanket implementations to exist + * multiple times, and these add no useful information. + * + * We detect these duplicates based on some simple heuristics (same trait + * name, file name, etc.). For these duplicates we select the one with the + * greatest file name (which usually is also the one with the greatest library + * version in the path) as the "canonical" implementation. + */ + private predicate isCanonicalImpl(Impl impl) { + not duplicatedImpl(impl, _) and impl.(ImplItemNode).isBlanketImplementation() + } + + /** + * Holds if `impl` is a blanket implementation for a type parameter and + * `traitBound` is the first non-trivial trait bound of that type parameter. + */ + private predicate blanketImplementationTraitBound(ImplItemNode impl, Trait traitBound) { + traitBound = + min(Trait trait, int i | + trait = impl.getBlanketImplementationTypeParam().resolveBound(i) and + // Exclude traits that are known to not narrow things down very much. + not trait.getName().getText() = + [ + "Sized", "Clone", + // The auto traits + "Send", "Sync", "Unpin", "UnwindSafe", "RefUnwindSafe" + ] + | + trait order by i + ) + } + + /** + * Holds if `impl` is a relevant blanket implementation that requires the + * trait `traitBound` and provides `f`, a method with name `name` and arity + * `arity`. + */ + private predicate blanketImplementationMethod( + ImplItemNode impl, Trait traitBound, string name, int arity, Function f + ) { + isCanonicalImpl(impl) and + blanketImplementationTraitBound(impl, traitBound) and + f.getParamList().hasSelfParam() and + arity = f.getParamList().getNumberOfParams() and + ( + f = impl.getAssocItem(name) + or + // If the trait has a method with a default implementation, then that + // target is interesting as well. + not exists(impl.getAssocItem(name)) and + f = impl.resolveTraitTy().getAssocItem(name) + ) and + // If the method is already available through one of the trait bounds on the + // type parameter (because they implement the trait targeted by the impl + // block) then ignore it. + not impl.getBlanketImplementationTypeParam().resolveABound().(TraitItemNode).getASuccessor(name) = + f + } + + pragma[nomagic] + predicate methodCallMatchesBlanketImpl( + MethodCall mc, Type t, ImplItemNode impl, Trait traitBound, Trait traitImpl, Function f + ) { + // Only check method calls where we have ruled out inherent method targets. + // Ideally we would also check if non-blanket method targets have been ruled + // out. + methodCallHasNoInherentTarget(mc) and + exists(string name, int arity | + isMethodCall(mc, t, name, arity) and + blanketImplementationMethod(impl, traitBound, name, arity, f) + ) and + traitImpl = impl.resolveTraitTy() + } + + private predicate relevantTraitVisible(Element mc, Trait trait) { + methodCallMatchesBlanketImpl(mc, _, _, _, trait, _) + } + + module SatisfiesConstraintInput implements SatisfiesConstraintInputSig { + pragma[nomagic] + predicate relevantConstraint(MethodCall mc, Type constraint) { + exists(Trait traitBound, Trait traitImpl | + methodCallMatchesBlanketImpl(mc, _, _, traitBound, traitImpl, _) and + TraitIsVisible::traitIsVisible(mc, traitImpl) and + traitBound = constraint.(TraitType).getTrait() + ) + } + + predicate useUniversalConditions() { none() } + } + + predicate hasBlanketImpl(MethodCall mc, Type t, Impl impl, Trait traitBound, Function f) { + SatisfiesConstraint::satisfiesConstraintType(mc, + TTrait(traitBound), _, _) and + methodCallMatchesBlanketImpl(mc, t, impl, traitBound, _, f) + } + + pragma[nomagic] + Function getMethodFromBlanketImpl(MethodCall mc) { hasBlanketImpl(mc, _, _, _, result) } +} + /** Gets a method from an `impl` block that matches the method call `mc`. */ pragma[nomagic] private Function getMethodFromImpl(MethodCall mc) { @@ -2162,6 +2316,8 @@ private Function resolveMethodCallTarget(MethodCall mc) { // The method comes from an `impl` block targeting the type of the receiver. result = getMethodFromImpl(mc) or + result = BlanketImplementation::getMethodFromBlanketImpl(mc) + or // The type of the receiver is a type parameter and the method comes from a // trait bound on the type parameter. result = getTypeParameterMethod(mc.getTypeAt(TypePath::nil()), mc.getMethodName()) @@ -2259,11 +2415,11 @@ private class AmbigousAssocFunctionCallExpr extends MkAmbigousAssocFunctionCallE } private module AmbigousAssocFuncIsInstantiationOfInput implements - IsInstantiationOfInputSig + IsInstantiationOfInputSig { pragma[nomagic] predicate potentialInstantiationOf( - AmbigousAssocFunctionCallExpr ce, TypeAbstraction impl, TypeMention constraint + AmbigousAssocFunctionCallExpr ce, TypeAbstraction impl, TypeMentionTypeTree constraint ) { exists(FunctionCallExpr call, Function resolved, Function cand, int pos | ce = MkAmbigousAssocFunctionCallExpr(call, resolved, pos) and @@ -2289,7 +2445,7 @@ private ItemNode resolveUnambigousFunctionCallTarget(FunctionCallExpr call) { pragma[nomagic] private Function resolveAmbigousFunctionCallTargetFromIndex(FunctionCallExpr call, int index) { exists(Impl impl, int pos, Function resolved | - IsInstantiationOf::isInstantiationOf(MkAmbigousAssocFunctionCallExpr(call, + IsInstantiationOf::isInstantiationOf(MkAmbigousAssocFunctionCallExpr(call, resolved, pos), impl, _) and result = call.getAnAmbigousCandidateRanked(impl, pos, resolved, index) | @@ -2420,14 +2576,10 @@ private module Cached { else any() ) and ( - result = inferAnnotatedType(n, path) - or result = inferAssignmentOperationType(n, path) or result = inferTypeEquality(n, path) or - result = inferImplicitSelfType(n, path) - or result = inferStructExprType(n, path) or result = inferPathExprType(n, path) @@ -2491,9 +2643,9 @@ private module Debug { Input2::conditionSatisfiesConstraint(abs, condition, constraint) } - predicate debugInferImplicitSelfType(SelfParam self, TypePath path, Type t) { + predicate debugInferShorthandSelfType(SelfParam self, TypePath path, Type t) { self = getRelevantLocatable() and - t = inferImplicitSelfType(self, path) + t = inferShorthandSelfType(self, path) } predicate debugInferCallExprBaseType(AstNode n, TypePath path, Type t) { diff --git a/rust/ql/lib/codeql/rust/security/CleartextTransmissionExtensions.qll b/rust/ql/lib/codeql/rust/security/CleartextTransmissionExtensions.qll index 2dfe77ee8ba1..7d5a91a55f74 100644 --- a/rust/ql/lib/codeql/rust/security/CleartextTransmissionExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/CleartextTransmissionExtensions.qll @@ -53,6 +53,6 @@ module CleartextTransmission { * A sink defined through MaD. */ private class ModelsAsDataSink extends Sink { - ModelsAsDataSink() { sinkNode(this, "transmission") } + ModelsAsDataSink() { sinkNode(this, ["transmission", "request-url"]) } } } diff --git a/rust/ql/lib/codeql/rust/security/RequestForgeryExtensions.qll b/rust/ql/lib/codeql/rust/security/RequestForgeryExtensions.qll new file mode 100644 index 000000000000..1822baff6448 --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/RequestForgeryExtensions.qll @@ -0,0 +1,49 @@ +/** + * Provides classes and predicates for reasoning about request forgery + * vulnerabilities. + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.FlowSink +private import codeql.rust.dataflow.FlowSource +private import codeql.rust.Concepts + +/** + * Provides default sources, sinks and barriers for detecting request forgery + * vulnerabilities, as well as extension points for adding your own. + */ +module RequestForgery { + /** + * A data flow source for request forgery vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for request forgery vulnerabilities. + */ + abstract class Sink extends QuerySink::Range { + /** + * Gets the name of a part of the request that may be tainted by this sink, + * such as the URL or the host. + */ + override string getSinkType() { result = "RequestForgery" } + } + + /** + * A barrier for request forgery vulnerabilities. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * An active threat-model source, considered as a flow source. + */ + private class ActiveThreatModelSourceAsSource extends Source, ActiveThreatModelSource { } + + /** + * A sink for request forgery from model data. + */ + private class ModelsAsDataSink extends Sink { + ModelsAsDataSink() { sinkNode(this, "request-url") } + } +} diff --git a/rust/ql/lib/ext/generated/reqwest.model.yml b/rust/ql/lib/ext/generated/reqwest.model.yml index 109a35a39e0b..ac907669ce97 100644 --- a/rust/ql/lib/ext/generated/reqwest.model.yml +++ b/rust/ql/lib/ext/generated/reqwest.model.yml @@ -424,21 +424,21 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["::delete", "Argument[0]", "transmission", "df-generated"] - - ["::get", "Argument[0]", "transmission", "df-generated"] - - ["::head", "Argument[0]", "transmission", "df-generated"] - - ["::patch", "Argument[0]", "transmission", "df-generated"] - - ["::post", "Argument[0]", "transmission", "df-generated"] - - ["::put", "Argument[0]", "transmission", "df-generated"] + - ["::delete", "Argument[0]", "request-url", "df-generated"] + - ["::get", "Argument[0]", "request-url", "df-generated"] + - ["::head", "Argument[0]", "request-url", "df-generated"] + - ["::patch", "Argument[0]", "request-url", "df-generated"] + - ["::post", "Argument[0]", "request-url", "df-generated"] + - ["::put", "Argument[0]", "request-url", "df-generated"] - ["::into_stream", "Argument[self]", "log-injection", "df-generated"] - ["::stream", "Argument[self]", "log-injection", "df-generated"] - ["::multipart", "Argument[0]", "log-injection", "df-generated"] - - ["::delete", "Argument[0]", "transmission", "df-generated"] - - ["::get", "Argument[0]", "transmission", "df-generated"] - - ["::head", "Argument[0]", "transmission", "df-generated"] - - ["::patch", "Argument[0]", "transmission", "df-generated"] - - ["::post", "Argument[0]", "transmission", "df-generated"] - - ["::put", "Argument[0]", "transmission", "df-generated"] + - ["::delete", "Argument[0]", "request-url", "df-generated"] + - ["::get", "Argument[0]", "request-url", "df-generated"] + - ["::head", "Argument[0]", "request-url", "df-generated"] + - ["::patch", "Argument[0]", "request-url", "df-generated"] + - ["::post", "Argument[0]", "request-url", "df-generated"] + - ["::put", "Argument[0]", "request-url", "df-generated"] - ["::into_reader", "Argument[self]", "log-injection", "df-generated"] - ["::reader", "Argument[self]", "log-injection", "df-generated"] - ["::read", "Argument[self]", "log-injection", "df-generated"] @@ -450,9 +450,9 @@ extensions: - ["::text_with_charset", "Argument[self]", "pointer-access", "df-generated"] - ["::call", "Argument[0]", "log-injection", "df-generated"] - ["::new", "Argument[1]", "pointer-access", "df-generated"] - - ["reqwest::blocking::get", "Argument[0]", "transmission", "df-generated"] + - ["reqwest::blocking::get", "Argument[0]", "request-url", "df-generated"] - ["reqwest::blocking::wait::timeout", "Argument[1]", "pointer-access", "df-generated"] - - ["reqwest::get", "Argument[0]", "transmission", "df-generated"] + - ["reqwest::get", "Argument[0]", "request-url", "df-generated"] - addsTo: pack: codeql/rust-all extensible: sourceModel diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index a8d8c4597572..d0e9a11ec16f 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.1.15 +version: 0.1.16 groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/CHANGELOG.md b/rust/ql/src/CHANGELOG.md index b8ca5b715684..48f64efbcdb7 100644 --- a/rust/ql/src/CHANGELOG.md +++ b/rust/ql/src/CHANGELOG.md @@ -1,3 +1,13 @@ +## 0.1.16 + +### New Queries + +* Added a new query, `rust/request-forgery`, for detecting server-side request forgery vulnerabilities. + +### Bug Fixes + +* The message for `rust/diagnostic/database-quality` has been updated to include detailed database health metrics. These changes are visible on the tool status page. + ## 0.1.15 ### New Queries diff --git a/rust/ql/src/change-notes/released/0.1.16.md b/rust/ql/src/change-notes/released/0.1.16.md new file mode 100644 index 000000000000..97666aba677d --- /dev/null +++ b/rust/ql/src/change-notes/released/0.1.16.md @@ -0,0 +1,9 @@ +## 0.1.16 + +### New Queries + +* Added a new query, `rust/request-forgery`, for detecting server-side request forgery vulnerabilities. + +### Bug Fixes + +* The message for `rust/diagnostic/database-quality` has been updated to include detailed database health metrics. These changes are visible on the tool status page. diff --git a/rust/ql/src/codeql-pack.release.yml b/rust/ql/src/codeql-pack.release.yml index 747196347438..a01dca921616 100644 --- a/rust/ql/src/codeql-pack.release.yml +++ b/rust/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.1.15 +lastReleaseVersion: 0.1.16 diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 0c1ad4faa1c5..8debbae1f51a 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.15 +version: 0.1.16 groups: - rust - queries diff --git a/rust/ql/src/queries/security/CWE-918/RequestForgery.qhelp b/rust/ql/src/queries/security/CWE-918/RequestForgery.qhelp new file mode 100644 index 000000000000..7017e2a6b570 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-918/RequestForgery.qhelp @@ -0,0 +1,48 @@ + + + + +

    +Directly incorporating user input into an HTTP request without validating the +input can facilitate server-side request forgery (SSRF) attacks. In these +attacks, the server may be tricked into making a request to an unintended API +endpoint or resource. + +If the server is connected to an internal network, attackers can bypass security +boundaries to target internal services. + +Forged requests can execute unintended actions, leak data if redirected to an +external server, or compromise the server if responses are handled insecurely. +

    +
    + + +

    +To guard against SSRF attacks, you should avoid putting user-provided input +directly into a request URL. Instead, maintain a list of authorized URLs on the +server; then choose from that list based on the input provided. Alternatively, +ensure requests constructed from user input are limited to a particular host or +a more restrictive URL prefix. +

    +
    + + +

    +The following example shows an HTTP request parameter being used directly to +form a new request without validating the input, which facilitates SSRF attacks. +It also shows how to remedy the problem by validating the user input against a +known fixed string. +

    + + +
    + + +
  • + OWASP Server Side Request Forgery. +
  • +
    + +
    diff --git a/rust/ql/src/queries/security/CWE-918/RequestForgery.ql b/rust/ql/src/queries/security/CWE-918/RequestForgery.ql new file mode 100644 index 000000000000..cbd1069a441b --- /dev/null +++ b/rust/ql/src/queries/security/CWE-918/RequestForgery.ql @@ -0,0 +1,38 @@ +/** + * @name Server-side request forgery + * @description Making a network request with user-controlled data in the URL allows for request forgery attacks. + * @kind path-problem + * @problem.severity error + * @security-severity 9.1 + * @precision high + * @id rust/request-forgery + * @tags security + * external/cwe/cwe-918 + */ + +private import rust +private import codeql.rust.dataflow.TaintTracking +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.security.RequestForgeryExtensions + +/** + * A taint-tracking configuration for detecting request forgery vulnerabilities. + */ +module RequestForgeryConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node source) { source instanceof RequestForgery::Source } + + predicate isSink(DataFlow::Node sink) { sink instanceof RequestForgery::Sink } + + predicate isBarrier(DataFlow::Node barrier) { barrier instanceof RequestForgery::Barrier } + + predicate observeDiffInformedIncrementalMode() { any() } +} + +module RequestForgeryFlow = TaintTracking::Global; + +import RequestForgeryFlow::PathGraph + +from RequestForgeryFlow::PathNode source, RequestForgeryFlow::PathNode sink +where RequestForgeryFlow::flowPath(source, sink) +select sink.getNode(), source, sink, "The URL of this request depends on a $@.", source.getNode(), + "user-provided value" diff --git a/rust/ql/src/queries/security/CWE-918/RequestForgery.rs b/rust/ql/src/queries/security/CWE-918/RequestForgery.rs new file mode 100644 index 000000000000..bb93a4b0a49e --- /dev/null +++ b/rust/ql/src/queries/security/CWE-918/RequestForgery.rs @@ -0,0 +1,39 @@ +// BAD: Endpoint handler that makes requests based on user input +async fn vulnerable_endpoint_handler(req: Request) -> Result { + // This request is vulnerable to SSRF attacks as the user controls the + // entire URL + let response = reqwest::get(&req.user_url).await; + + match response { + Ok(resp) => { + let body = resp.text().await.unwrap_or_default(); + Ok(Response { + message: "Success".to_string(), + data: body, + }) + } + Err(_) => Err("Request failed") + } +} + +// GOOD: Validate user input against an allowlist +async fn secure_endpoint_handler(req: Request) -> Result { + // Allow list of specific, known-safe URLs + let allowed_hosts = ["api.example.com", "trusted-service.com"]; + + if !allowed_hosts.contains(&req.user_url) { + return Err("Untrusted domain"); + } + // This request is safe as the user input has been validated + let response = reqwest::get(&req.user_url).await; + match response { + Ok(resp) => { + let body = resp.text().await.unwrap_or_default(); + Ok(Response { + message: "Success".to_string(), + data: body, + }) + } + Err(_) => Err("Request failed") + } +} diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index bada752ab2ed..7a1de4f13144 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -22,6 +22,7 @@ private import codeql.rust.security.AccessInvalidPointerExtensions private import codeql.rust.security.CleartextLoggingExtensions private import codeql.rust.security.CleartextStorageDatabaseExtensions private import codeql.rust.security.CleartextTransmissionExtensions +private import codeql.rust.security.RequestForgeryExtensions private import codeql.rust.security.LogInjectionExtensions private import codeql.rust.security.SqlInjectionExtensions private import codeql.rust.security.TaintedPathExtensions diff --git a/rust/ql/src/queries/telemetry/DatabaseQualityDiagnostics.ql b/rust/ql/src/queries/telemetry/DatabaseQualityDiagnostics.ql index 18e7445939f9..63fb1e4c6cc5 100644 --- a/rust/ql/src/queries/telemetry/DatabaseQualityDiagnostics.ql +++ b/rust/ql/src/queries/telemetry/DatabaseQualityDiagnostics.ql @@ -9,22 +9,36 @@ import rust import DatabaseQuality import codeql.util.Unit +private predicate diagnostic(string msg, float value, float threshold) { + CallTargetStatsReport::percentageOfOk(msg, value) and threshold = 50 + or + MacroCallTargetStatsReport::percentageOfOk(msg, value) and threshold = 50 +} + +private string getDbHealth() { + result = + strictconcat(string msg, float value, float threshold | + diagnostic(msg, value, threshold) + | + msg + ": " + value.floor() + " % (threshold " + threshold.floor() + " %)", ". " + ) +} + class DbQualityDiagnostic extends Unit { DbQualityDiagnostic() { - exists(float percentageGood | - CallTargetStatsReport::percentageOfOk(_, percentageGood) and percentageGood < 50 - or - MacroCallTargetStatsReport::percentageOfOk(_, percentageGood) and percentageGood < 50 + exists(float percentageGood, float threshold | + diagnostic(_, percentageGood, threshold) and + percentageGood < threshold ) } string toString() { result = "Scanning Rust code completed successfully, but the scan encountered issues. " + - "This may be caused by problems identifying dependencies or use of generated source code, among other reasons -- " - + - "see other CodeQL diagnostics reported on the CodeQL status page for more details of possible causes. " - + "Addressing these warnings is advisable to avoid false-positive or missing results." + "This may be caused by problems identifying dependencies or use of generated source code. " + + "Some metrics of the database quality are: " + getDbHealth() + ". " + + "Ideally these metrics should be above their thresholds. " + + "Addressing these issues is advisable to avoid false-positives or missing results." } } diff --git a/rust/ql/test/extractor-tests/generated/AssocTypeArg/AssocTypeArg.expected b/rust/ql/test/extractor-tests/generated/AssocTypeArg/AssocTypeArg.expected index 83bfd832501b..45099ac5990f 100644 --- a/rust/ql/test/extractor-tests/generated/AssocTypeArg/AssocTypeArg.expected +++ b/rust/ql/test/extractor-tests/generated/AssocTypeArg/AssocTypeArg.expected @@ -9,4 +9,4 @@ getRetType getReturnTypeSyntax getTypeRepr getTypeBoundList -| gen_assoc_type_arg.rs:9:21:9:31 | AssocTypeArg | gen_assoc_type_arg.rs:9:27:9:31 | TypeBoundList | +| gen_assoc_type_arg.rs:9:21:9:31 | AssocTypeArg | gen_assoc_type_arg.rs:9:27:9:31 | ... | diff --git a/rust/ql/test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.expected b/rust/ql/test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.expected index 14ff9874ffb3..e996a7524062 100644 --- a/rust/ql/test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.expected +++ b/rust/ql/test/extractor-tests/generated/DynTraitTypeRepr/DynTraitTypeRepr.expected @@ -1,4 +1,4 @@ instances | gen_dyn_trait_type_repr.rs:7:13:7:21 | DynTraitTypeRepr | getTypeBoundList -| gen_dyn_trait_type_repr.rs:7:13:7:21 | DynTraitTypeRepr | gen_dyn_trait_type_repr.rs:7:17:7:21 | TypeBoundList | +| gen_dyn_trait_type_repr.rs:7:13:7:21 | DynTraitTypeRepr | gen_dyn_trait_type_repr.rs:7:17:7:21 | ... | diff --git a/rust/ql/test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.expected b/rust/ql/test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.expected index aa04363dc445..5c9774002bb6 100644 --- a/rust/ql/test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.expected +++ b/rust/ql/test/extractor-tests/generated/ImplTraitTypeRepr/ImplTraitTypeRepr.expected @@ -1,4 +1,4 @@ instances -| gen_impl_trait_type_repr.rs:7:17:7:41 | ImplTraitTypeRepr | +| gen_impl_trait_type_repr.rs:7:17:7:41 | impl ... | getTypeBoundList -| gen_impl_trait_type_repr.rs:7:17:7:41 | ImplTraitTypeRepr | gen_impl_trait_type_repr.rs:7:22:7:41 | TypeBoundList | +| gen_impl_trait_type_repr.rs:7:17:7:41 | impl ... | gen_impl_trait_type_repr.rs:7:22:7:41 | ... | diff --git a/rust/ql/test/extractor-tests/generated/TraitAlias/TraitAlias.expected b/rust/ql/test/extractor-tests/generated/TraitAlias/TraitAlias.expected index 5daf06da1c37..fe3c1fd8524b 100644 --- a/rust/ql/test/extractor-tests/generated/TraitAlias/TraitAlias.expected +++ b/rust/ql/test/extractor-tests/generated/TraitAlias/TraitAlias.expected @@ -6,6 +6,6 @@ getGenericParamList getName | gen_trait_alias.rs:7:5:7:26 | TraitAlias | gen_trait_alias.rs:7:11:7:13 | Foo | getTypeBoundList -| gen_trait_alias.rs:7:5:7:26 | TraitAlias | gen_trait_alias.rs:7:17:7:25 | TypeBoundList | +| gen_trait_alias.rs:7:5:7:26 | TraitAlias | gen_trait_alias.rs:7:17:7:25 | ... + ... | getVisibility getWhereClause diff --git a/rust/ql/test/extractor-tests/generated/TypeBoundList/TypeBoundList.expected b/rust/ql/test/extractor-tests/generated/TypeBoundList/TypeBoundList.expected index e195424d0979..4cdfca9a2d19 100644 --- a/rust/ql/test/extractor-tests/generated/TypeBoundList/TypeBoundList.expected +++ b/rust/ql/test/extractor-tests/generated/TypeBoundList/TypeBoundList.expected @@ -1,5 +1,5 @@ instances -| gen_type_bound_list.rs:7:15:7:27 | TypeBoundList | +| gen_type_bound_list.rs:7:15:7:27 | ... + ... | getBound -| gen_type_bound_list.rs:7:15:7:27 | TypeBoundList | 0 | gen_type_bound_list.rs:7:15:7:19 | TypeBound | -| gen_type_bound_list.rs:7:15:7:27 | TypeBoundList | 1 | gen_type_bound_list.rs:7:23:7:27 | TypeBound | +| gen_type_bound_list.rs:7:15:7:27 | ... + ... | 0 | gen_type_bound_list.rs:7:15:7:19 | TypeBound | +| gen_type_bound_list.rs:7:15:7:27 | ... + ... | 1 | gen_type_bound_list.rs:7:23:7:27 | TypeBound | diff --git a/rust/ql/test/extractor-tests/generated/WherePred/WherePred.expected b/rust/ql/test/extractor-tests/generated/WherePred/WherePred.expected index 41b5739818cd..e7dd9b64fce1 100644 --- a/rust/ql/test/extractor-tests/generated/WherePred/WherePred.expected +++ b/rust/ql/test/extractor-tests/generated/WherePred/WherePred.expected @@ -10,6 +10,6 @@ getTypeRepr | gen_where_pred.rs:7:46:7:53 | WherePred | gen_where_pred.rs:7:46:7:46 | U | | gen_where_pred.rs:9:31:9:54 | WherePred | gen_where_pred.rs:9:39:9:39 | T | getTypeBoundList -| gen_where_pred.rs:7:36:7:43 | WherePred | gen_where_pred.rs:7:39:7:43 | TypeBoundList | -| gen_where_pred.rs:7:46:7:53 | WherePred | gen_where_pred.rs:7:49:7:53 | TypeBoundList | -| gen_where_pred.rs:9:31:9:54 | WherePred | gen_where_pred.rs:9:42:9:54 | TypeBoundList | +| gen_where_pred.rs:7:36:7:43 | WherePred | gen_where_pred.rs:7:39:7:43 | ... | +| gen_where_pred.rs:7:46:7:53 | WherePred | gen_where_pred.rs:7:49:7:53 | ... | +| gen_where_pred.rs:9:31:9:54 | WherePred | gen_where_pred.rs:9:42:9:54 | ... | diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected index aab630af29fc..11f670aabff1 100644 --- a/rust/ql/test/library-tests/dataflow/global/viableCallable.expected +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.expected @@ -98,10 +98,10 @@ | main.rs:326:17:326:25 | source(...) | main.rs:1:1:3:1 | fn source | | main.rs:327:9:327:15 | sink(...) | main.rs:5:1:7:1 | fn sink | | main.rs:330:5:330:17 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:334:13:334:55 | ...::block_on(...) | file://:0:0:0:0 | fn block_on | +| main.rs:334:13:334:55 | ...::block_on(...) | {EXTERNAL LOCATION} | fn block_on | | main.rs:334:41:334:54 | async_source(...) | main.rs:315:1:319:1 | fn async_source | | main.rs:335:5:335:11 | sink(...) | main.rs:5:1:7:1 | fn sink | -| main.rs:337:5:337:62 | ...::block_on(...) | file://:0:0:0:0 | fn block_on | +| main.rs:337:5:337:62 | ...::block_on(...) | {EXTERNAL LOCATION} | fn block_on | | main.rs:337:33:337:61 | test_async_await_async_part(...) | main.rs:321:1:331:1 | fn test_async_await_async_part | | main.rs:341:5:341:22 | data_out_of_call(...) | main.rs:16:1:19:1 | fn data_out_of_call | | main.rs:342:5:342:35 | data_out_of_call_side_effect1(...) | main.rs:35:1:40:1 | fn data_out_of_call_side_effect1 | diff --git a/rust/ql/test/library-tests/dataflow/global/viableCallable.qlref b/rust/ql/test/library-tests/dataflow/global/viableCallable.qlref new file mode 100644 index 000000000000..29d8fc7b11a1 --- /dev/null +++ b/rust/ql/test/library-tests/dataflow/global/viableCallable.qlref @@ -0,0 +1,2 @@ +query: viableCallable.ql +postprocess: utils/test/ExternalLocationPostProcessing.ql \ No newline at end of file diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 86bd270ba935..f4fb726ad37c 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -1005,12 +1005,15 @@ readStep | main.rs:458:5:458:11 | mut_arr | file://:0:0:0:0 | element | main.rs:458:5:458:14 | mut_arr[1] | | main.rs:459:13:459:19 | mut_arr | file://:0:0:0:0 | element | main.rs:459:13:459:22 | mut_arr[1] | | main.rs:461:10:461:16 | mut_arr | file://:0:0:0:0 | element | main.rs:461:10:461:19 | mut_arr[0] | +| main.rs:467:24:467:33 | [post] receiver for source(...) | file://:0:0:0:0 | &ref | main.rs:467:24:467:33 | [post] source(...) | | main.rs:468:9:468:20 | TuplePat | file://:0:0:0:0 | tuple.0 | main.rs:468:10:468:13 | cond | | main.rs:468:9:468:20 | TuplePat | file://:0:0:0:0 | tuple.1 | main.rs:468:16:468:19 | name | | main.rs:468:25:468:29 | names | file://:0:0:0:0 | element | main.rs:468:9:468:20 | TuplePat | | main.rs:470:41:470:67 | [post] \|...\| ... | main.rs:467:9:467:20 | captured default_name | main.rs:470:41:470:67 | [post] default_name | +| main.rs:470:44:470:55 | [post] receiver for default_name | file://:0:0:0:0 | &ref | main.rs:470:44:470:55 | [post] default_name | | main.rs:470:44:470:55 | this | main.rs:467:9:467:20 | captured default_name | main.rs:470:44:470:55 | default_name | | main.rs:471:18:471:18 | [post] receiver for n | file://:0:0:0:0 | &ref | main.rs:471:18:471:18 | [post] n | +| main.rs:494:13:494:13 | [post] receiver for a | file://:0:0:0:0 | &ref | main.rs:494:13:494:13 | [post] a | | main.rs:495:13:495:13 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:495:13:495:13 | [post] b | | main.rs:496:18:496:18 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:496:18:496:18 | [post] b | | main.rs:507:10:507:11 | vs | file://:0:0:0:0 | element | main.rs:507:10:507:14 | vs[0] | @@ -1110,8 +1113,11 @@ storeStep | main.rs:455:27:455:27 | 2 | file://:0:0:0:0 | element | main.rs:455:23:455:31 | [...] | | main.rs:455:30:455:30 | 3 | file://:0:0:0:0 | element | main.rs:455:23:455:31 | [...] | | main.rs:458:18:458:27 | source(...) | file://:0:0:0:0 | element | main.rs:458:5:458:11 | [post] mut_arr | +| main.rs:467:24:467:33 | source(...) | file://:0:0:0:0 | &ref | main.rs:467:24:467:33 | receiver for source(...) | | main.rs:470:41:470:67 | default_name | main.rs:467:9:467:20 | captured default_name | main.rs:470:41:470:67 | \|...\| ... | +| main.rs:470:44:470:55 | default_name | file://:0:0:0:0 | &ref | main.rs:470:44:470:55 | receiver for default_name | | main.rs:471:18:471:18 | n | file://:0:0:0:0 | &ref | main.rs:471:18:471:18 | receiver for n | +| main.rs:494:13:494:13 | a | file://:0:0:0:0 | &ref | main.rs:494:13:494:13 | receiver for a | | main.rs:495:13:495:13 | b | file://:0:0:0:0 | &ref | main.rs:495:13:495:13 | receiver for b | | main.rs:496:18:496:18 | b | file://:0:0:0:0 | &ref | main.rs:496:18:496:18 | receiver for b | | main.rs:505:15:505:24 | source(...) | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | diff --git a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected index 8448e7cd99a5..5ba71c14933d 100644 --- a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected @@ -73,6 +73,18 @@ multipleCallTargets | test.rs:977:14:977:29 | ...::_print(...) | | test.rs:979:27:979:36 | ...::_print(...) | | test.rs:980:28:980:41 | ...::_print(...) | +| test_futures_io.rs:45:27:45:84 | ...::read(...) | +| test_futures_io.rs:49:27:49:51 | reader.read(...) | +| test_futures_io.rs:83:22:83:39 | reader2.fill_buf() | +| test_futures_io.rs:103:27:103:85 | ...::read(...) | +| test_futures_io.rs:107:27:107:52 | reader2.read(...) | +| test_futures_io.rs:125:22:125:39 | reader2.fill_buf() | +| test_futures_io.rs:132:27:132:62 | reader2.read_until(...) | +| test_futures_io.rs:139:27:139:54 | reader2.read_line(...) | +| test_futures_io.rs:146:27:146:58 | reader2.read_to_end(...) | +| test_futures_io.rs:152:32:152:46 | reader2.lines() | +| test_futures_io.rs:153:14:153:32 | lines_stream.next() | +| test_futures_io.rs:154:32:154:50 | lines_stream.next() | | web_frameworks.rs:13:14:13:22 | a.as_str() | | web_frameworks.rs:13:14:13:23 | a.as_str() | | web_frameworks.rs:14:14:14:24 | a.as_bytes() | diff --git a/rust/ql/test/library-tests/dataflow/sources/test.rs b/rust/ql/test/library-tests/dataflow/sources/test.rs index 64d74d9527d4..6e30159ea1a3 100644 --- a/rust/ql/test/library-tests/dataflow/sources/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/test.rs @@ -309,28 +309,28 @@ async fn test_tokio_stdin() -> Result<(), Box> { let mut stdin = tokio::io::stdin(); // $ Alert[rust/summary/taint-sources] let mut buffer = [0u8; 100]; let _bytes = stdin.read(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow -- we cannot resolve the `read` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow } { let mut stdin = tokio::io::stdin(); // $ Alert[rust/summary/taint-sources] let mut buffer = Vec::::new(); let _bytes = stdin.read_to_end(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_to_end` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow } { let mut stdin = tokio::io::stdin(); // $ Alert[rust/summary/taint-sources] let mut buffer = String::new(); let _bytes = stdin.read_to_string(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_to_string` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow } { let mut stdin = tokio::io::stdin(); // $ Alert[rust/summary/taint-sources] let mut buffer = [0; 100]; stdin.read_exact(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_exact` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow } { @@ -339,17 +339,17 @@ async fn test_tokio_stdin() -> Result<(), Box> { let v2 = stdin.read_i16().await?; let v3 = stdin.read_f32().await?; let v4 = stdin.read_i64_le().await?; - sink(v1); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_u8` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(v2); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_i16` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(v3); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_f32` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(v4); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_i64_le` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(v1); // $ hasTaintFlow + sink(v2); // $ hasTaintFlow + sink(v3); // $ hasTaintFlow + sink(v4); // $ hasTaintFlow } { let mut stdin = tokio::io::stdin(); // $ Alert[rust/summary/taint-sources] let mut buffer = bytes::BytesMut::new(); stdin.read_buf(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_buf` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow } // --- async reading from stdin (BufReader) --- @@ -357,7 +357,7 @@ async fn test_tokio_stdin() -> Result<(), Box> { { let mut reader = tokio::io::BufReader::new(tokio::io::stdin()); // $ Alert[rust/summary/taint-sources] let data = reader.fill_buf().await?; - sink(&data); // $ MISSING: hasTaintFlow -- we cannot resolve the `fill_buf` call above, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` + sink(&data); // $ hasTaintFlow } { @@ -370,31 +370,31 @@ async fn test_tokio_stdin() -> Result<(), Box> { let mut buffer = String::new(); let mut reader = tokio::io::BufReader::new(tokio::io::stdin()); // $ Alert[rust/summary/taint-sources] reader.read_line(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_line` call above, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` + sink(&buffer); // $ hasTaintFlow } { let mut buffer = Vec::::new(); let mut reader = tokio::io::BufReader::new(tokio::io::stdin()); // $ Alert[rust/summary/taint-sources] reader.read_until(b',', &mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_until` call above, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` - sink(buffer[0]); // $ MISSING: hasTaintFlow -- we cannot resolve the `read_until` call above, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` + sink(&buffer); // $ hasTaintFlow + sink(buffer[0]); // $ hasTaintFlow } { let mut reader_split = tokio::io::BufReader::new(tokio::io::stdin()).split(b','); // $ Alert[rust/summary/taint-sources] - sink(reader_split.next_segment().await?.unwrap()); // $ MISSING: hasTaintFlow -- we cannot resolve the `split` call above, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` + sink(reader_split.next_segment().await?.unwrap()); // $ hasTaintFlow while let Some(chunk) = reader_split.next_segment().await? { - sink(chunk); // $ MISSING: hasTaintFlow + sink(chunk); // $ hasTaintFlow } } { let reader = tokio::io::BufReader::new(tokio::io::stdin()); // $ Alert[rust/summary/taint-sources] let mut lines = reader.lines(); - sink(lines.next_line().await?.unwrap()); // $ MISSING: hasTaintFlow -- we cannot resolve the `lines` call above, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` + sink(lines.next_line().await?.unwrap()); // $ hasTaintFlow while let Some(line) = lines.next_line().await? { - sink(line); // $ MISSING: hasTaintFlow + sink(line); // $ hasTaintFlow } } @@ -583,25 +583,25 @@ async fn test_tokio_file() -> std::io::Result<()> { { let mut buffer = [0u8; 100]; let _bytes = file.read(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow="file.txt" } { let mut buffer = Vec::::new(); let _bytes = file.read_to_end(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read_to_end` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow="file.txt" } { let mut buffer = String::new(); let _bytes = file.read_to_string(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read_to_string` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow="file.txt" } { let mut buffer = [0; 100]; file.read_exact(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read_exact` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow="file.txt" } { @@ -609,16 +609,16 @@ async fn test_tokio_file() -> std::io::Result<()> { let v2 = file.read_i16().await?; let v3 = file.read_f32().await?; let v4 = file.read_i64_le().await?; - sink(v1); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read_u8` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(v2); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read_i16` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(v3); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read_f32` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(v4); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read_i64_le` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(v1); // $ hasTaintFlow="file.txt" + sink(v2); // $ hasTaintFlow="file.txt" + sink(v3); // $ hasTaintFlow="file.txt" + sink(v4); // $ hasTaintFlow="file.txt" } { let mut buffer = bytes::BytesMut::new(); file.read_buf(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow="file.txt" -- we cannot resolve the `read_buf` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer); // $ hasTaintFlow="file.txt" } // --- OpenOptions --- @@ -627,7 +627,7 @@ async fn test_tokio_file() -> std::io::Result<()> { let mut f1 = tokio::fs::OpenOptions::new().open("f1.txt").await?; // $ Alert[rust/summary/taint-sources] let mut buffer = [0u8; 1024]; let _bytes = f1.read(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow="f1.txt" + sink(&buffer); // $ hasTaintFlow="f1.txt" } // --- misc operations --- @@ -775,8 +775,8 @@ async fn test_tokio_tcpstream(case: i64) -> std::io::Result<()> { sink(buffer1[0]); // $ hasTaintFlow=address println!("buffer2 = {:?}", buffer2); - sink(&buffer2); // $ MISSING: hasTaintFlow=address -- we cannot resolve the `read` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(buffer2[0]); // $ MISSING: hasTaintFlow=address -- we cannot resolve the `read` call above, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` + sink(&buffer2); // $ hasTaintFlow=address + sink(buffer2[0]); // $ hasTaintFlow=address let buffer_string = String::from_utf8_lossy(&buffer2[..n2]); println!("string = {}", buffer_string); diff --git a/rust/ql/test/library-tests/dataflow/sources/test_futures_io.rs b/rust/ql/test/library-tests/dataflow/sources/test_futures_io.rs index 1acc5ce21b0f..b93f03535258 100644 --- a/rust/ql/test/library-tests/dataflow/sources/test_futures_io.rs +++ b/rust/ql/test/library-tests/dataflow/sources/test_futures_io.rs @@ -43,12 +43,12 @@ async fn test_futures_rustls_futures_io() -> io::Result<()> { // using the `AsyncReadExt::read` extension method (higher-level) let mut buffer1 = [0u8; 64]; let bytes_read1 = futures::io::AsyncReadExt::read(&mut reader, &mut buffer1).await?; // we cannot resolve the `read` call, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(&buffer1[..bytes_read1]); // $ MISSING: hasTaintFlow=url + sink(&buffer1[..bytes_read1]); // $ hasTaintFlow=url let mut buffer2 = [0u8; 64]; let bytes_read2 = reader.read(&mut buffer2).await?; // we cannot resolve the `read` call, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(&buffer2[..bytes_read2]); // $ MISSING: hasTaintFlow=url + sink(&buffer2[..bytes_read2]); // $ hasTaintFlow=url } let mut reader2 = futures::io::BufReader::new(reader); @@ -81,7 +81,7 @@ async fn test_futures_rustls_futures_io() -> io::Result<()> { { // using the `AsyncBufReadExt::fill_buf` extension method (higher-level) let buffer = reader2.fill_buf().await?; // we cannot resolve the `fill_buf` call, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` - sink(buffer); // $ MISSING: hasTaintFlow=url + sink(buffer); // $ hasTaintFlow=url } { @@ -101,11 +101,11 @@ async fn test_futures_rustls_futures_io() -> io::Result<()> { // using the `AsyncReadExt::read` extension method (higher-level) let mut buffer1 = [0u8; 64]; let bytes_read1 = futures::io::AsyncReadExt::read(&mut reader2, &mut buffer1).await?; // we cannot resolve the `read` call, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(&buffer1[..bytes_read1]); // $ MISSING: hasTaintFlow=url + sink(&buffer1[..bytes_read1]); // $ hasTaintFlow=url let mut buffer2 = [0u8; 64]; let bytes_read2 = reader2.read(&mut buffer2).await?; // we cannot resolve the `read` call, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(&buffer2[..bytes_read2]); // $ MISSING: hasTaintFlow=url + sink(&buffer2[..bytes_read2]); // $ hasTaintFlow=url } { @@ -123,28 +123,28 @@ async fn test_futures_rustls_futures_io() -> io::Result<()> { { // using the `AsyncBufReadExt::fill_buf` extension method (higher-level) let buffer = reader2.fill_buf().await?; // we cannot resolve the `fill_buf` call, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` - sink(buffer); // $ MISSING: hasTaintFlow=url + sink(buffer); // $ hasTaintFlow=url } { // using the `AsyncBufReadExt::read_until` extension method let mut line = Vec::new(); let _bytes_read = reader2.read_until(b'\n', &mut line).await?; // we cannot resolve the `read_until` call, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` - sink(&line); // $ MISSING: hasTaintFlow=url + sink(&line); // $ hasTaintFlow=url } { // using the `AsyncBufReadExt::read_line` extension method let mut line = String::new(); let _bytes_read = reader2.read_line(&mut line).await?; // we cannot resolve the `read_line` call, which comes from `impl AsyncBufReadExt for R {}` in `async_buf_read_ext.rs` - sink(&line); // $ MISSING: hasTaintFlow=url + sink(&line); // $ hasTaintFlow=url } { // using the `AsyncBufReadExt::read_to_end` extension method let mut buffer = Vec::with_capacity(1024); let _bytes_read = reader2.read_to_end(&mut buffer).await?; // we cannot resolve the `read` call, which comes from `impl AsyncReadExt for R {}` in `async_read_ext.rs` - sink(&buffer); // $ MISSING: hasTaintFlow=url + sink(&buffer); // $ hasTaintFlow=url } { diff --git a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected index be270de025fe..ea6e06ef616c 100644 --- a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected @@ -1,6 +1,6 @@ models -| 1 | Summary: ::from; Argument[0].Reference; ReturnValue; value | -| 2 | Summary: ::from; Argument[0]; ReturnValue; value | +| 1 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; value | +| 2 | Summary: ::from; Argument[0].Reference; ReturnValue; value | | 3 | Summary: ::add; Argument[self]; ReturnValue; value | | 4 | Summary: ::as_str; Argument[self]; ReturnValue; value | | 5 | Summary: ::as_str; Argument[self]; ReturnValue; value | diff --git a/rust/ql/test/library-tests/path-resolution/my.rs b/rust/ql/test/library-tests/path-resolution/my.rs index f2488df4959c..af2d35ed2753 100644 --- a/rust/ql/test/library-tests/path-resolution/my.rs +++ b/rust/ql/test/library-tests/path-resolution/my.rs @@ -30,7 +30,7 @@ fn int_div( ) -> Result // $ item=my::Result $ item=i32 { if y == 0 { - return Err("Div by zero".to_string()); // $ item=Err + return Err("Div by zero".to_string()); // $ item=Err item=to_string } Ok(x / y) // $ item=Ok } diff --git a/rust/ql/test/library-tests/type-inference/blanket_impl.rs b/rust/ql/test/library-tests/type-inference/blanket_impl.rs new file mode 100644 index 000000000000..aa642854268c --- /dev/null +++ b/rust/ql/test/library-tests/type-inference/blanket_impl.rs @@ -0,0 +1,161 @@ +// Tests for method resolution targeting blanket trait implementations + +mod basic_blanket_impl { + #[derive(Debug, Copy, Clone)] + struct S1; + + trait Clone1 { + fn clone1(&self) -> Self; + } + + trait Duplicatable { + fn duplicate(&self) -> Self + where + Self: Sized; + } + + impl Clone1 for S1 { + // S1::clone1 + fn clone1(&self) -> Self { + *self // $ target=deref + } + } + + // Blanket implementation for all types that implement Display and Clone + impl Duplicatable for T { + // Clone1duplicate + fn duplicate(&self) -> Self { + self.clone1() // $ target=clone1 + } + } + + pub fn test_basic_blanket() { + let x = S1.clone1(); // $ target=S1::clone1 + println!("{x:?}"); + let y = S1.duplicate(); // $ target=Clone1duplicate + println!("{y:?}"); + } +} + +mod extension_trait_blanket_impl { + // This tests: + // 1. A trait that is implemented for a type parameter + // 2. An extension trait + // 3. A blanket implementation of the extension trait for a type parameter + + trait Flag { + fn read_flag(&self) -> bool; + } + + trait TryFlag { + fn try_read_flag(&self) -> Option; + } + + impl TryFlag for Fl + where + Fl: Flag, + { + fn try_read_flag(&self) -> Option { + Some(self.read_flag()) // $ target=read_flag + } + } + + trait TryFlagExt: TryFlag { + // TryFlagExt::try_read_flag_twice + fn try_read_flag_twice(&self) -> Option { + self.try_read_flag() // $ target=try_read_flag + } + } + + impl TryFlagExt for T {} + + trait AnotherTryFlag { + // AnotherTryFlag::try_read_flag_twice + fn try_read_flag_twice(&self) -> Option; + } + + struct MyTryFlag { + flag: bool, + } + + impl TryFlag for MyTryFlag { + // MyTryFlag::try_read_flag + fn try_read_flag(&self) -> Option { + Some(self.flag) // $ fieldof=MyTryFlag + } + } + + struct MyFlag { + flag: bool, + } + + impl Flag for MyFlag { + // MyFlag::read_flag + fn read_flag(&self) -> bool { + self.flag // $ fieldof=MyFlag + } + } + + struct MyOtherFlag { + flag: bool, + } + + impl AnotherTryFlag for MyOtherFlag { + // MyOtherFlag::try_read_flag_twice + fn try_read_flag_twice(&self) -> Option { + Some(self.flag) // $ fieldof=MyOtherFlag + } + } + + fn test() { + let my_try_flag = MyTryFlag { flag: true }; + let result = my_try_flag.try_read_flag_twice(); // $ target=TryFlagExt::try_read_flag_twice + + let my_flag = MyFlag { flag: true }; + // Here `TryFlagExt::try_read_flag_twice` is a target since there is a + // blanket implementaton of `TryFlag` for `Flag`. + let result = my_flag.try_read_flag_twice(); // $ MISSING: target=TryFlagExt::try_read_flag_twice + + let my_other_flag = MyOtherFlag { flag: true }; + // Here `TryFlagExt::try_read_flag_twice` is _not_ a target since + // `MyOtherFlag` does not implement `TryFlag`. + let result = my_other_flag.try_read_flag_twice(); // $ target=MyOtherFlag::try_read_flag_twice + } +} + +pub mod sql_exec { + // a highly simplified model of `MySqlConnection.execute` in SQLx + + trait Connection {} + + trait Executor { + fn execute1(&self); + fn execute2(&self, query: E); + } + + impl Executor for T { + fn execute1(&self) { + println!("Executor::execute1"); + } + + fn execute2(&self, _query: E) { + println!("Executor::execute2"); + } + } + + struct MySqlConnection {} + + impl Connection for MySqlConnection {} + + pub fn f() { + let c = MySqlConnection {}; // $ certainType=c:MySqlConnection + + c.execute1(); // $ target=execute1 + MySqlConnection::execute1(&c); // $ MISSING: target=execute1 + + c.execute2("SELECT * FROM users"); // $ target=execute2 + c.execute2::<&str>("SELECT * FROM users"); // $ target=execute2 + MySqlConnection::execute2(&c, "SELECT * FROM users"); // $ MISSING: target=execute2 + MySqlConnection::execute2::<&str>(&c, "SELECT * FROM users"); // $ MISSING: target=execute2 + } +} diff --git a/rust/ql/test/library-tests/type-inference/closure.rs b/rust/ql/test/library-tests/type-inference/closure.rs index 1b11335947c1..43b26819325e 100644 --- a/rust/ql/test/library-tests/type-inference/closure.rs +++ b/rust/ql/test/library-tests/type-inference/closure.rs @@ -5,7 +5,7 @@ mod simple_closures { // A simple closure without type annotations or invocations. let my_closure = |a, b| a && b; - let x: i64 = 1i64; // $ type=x:i64 + let x: i64 = 1i64; // $ certainType=x:i64 let add_one = |n| n + 1i64; // $ target=add let _y = add_one(x); // $ type=_y:i64 @@ -27,7 +27,7 @@ mod simple_closures { // The return type of `id2` is inferred from the type of the call expression. let id2 = |b| b; let arg = Default::default(); // $ target=default type=arg:bool - let _b2: bool = id2(arg); // $ type=_b2:bool + let _b2: bool = id2(arg); // $ certainType=_b2:bool } } @@ -60,7 +60,7 @@ mod fn_once_trait { let _r = apply(f, true); // $ target=apply type=_r:i64 let f = |x| x + 1; // $ MISSING: type=x:i64 target=add - let _r2 = apply_two(f); // $ target=apply_two type=_r2:i64 + let _r2 = apply_two(f); // $ target=apply_two certainType=_r2:i64 } } diff --git a/rust/ql/test/library-tests/type-inference/dyn_type.rs b/rust/ql/test/library-tests/type-inference/dyn_type.rs index 24f320ec3f40..c4514a2872a2 100644 --- a/rust/ql/test/library-tests/type-inference/dyn_type.rs +++ b/rust/ql/test/library-tests/type-inference/dyn_type.rs @@ -101,7 +101,7 @@ fn test_assoc_type(obj: &dyn AssocTrait) { pub fn test() { test_basic_dyn_trait(&MyStruct { value: 42 }); // $ target=test_basic_dyn_trait test_generic_dyn_trait(&GenStruct { - value: "".to_string(), + value: "".to_string(), // $ target=to_string }); // $ target=test_generic_dyn_trait test_poly_dyn_trait(); // $ target=test_poly_dyn_trait test_assoc_type(&GenStruct { value: 100 }); // $ target=test_assoc_type diff --git a/rust/ql/test/library-tests/type-inference/main.rs b/rust/ql/test/library-tests/type-inference/main.rs index 038ab8be29f3..107a133fa222 100644 --- a/rust/ql/test/library-tests/type-inference/main.rs +++ b/rust/ql/test/library-tests/type-inference/main.rs @@ -34,7 +34,7 @@ mod field_access { fn generic_field_access() { // Explicit type argument - let x = GenericThing:: { a: S }; // $ type=x:A.S + let x = GenericThing:: { a: S }; // $ certainType=x:A.S println!("{:?}", x.a); // $ fieldof=GenericThing // Implicit type argument @@ -73,7 +73,7 @@ mod method_impl { impl Foo { pub fn m1(self) -> Self { - self + self // $ certainType=self:Foo } pub fn m2(self) -> Foo { @@ -108,7 +108,7 @@ mod trait_impl { impl MyTrait for MyThing { // MyThing::trait_method fn trait_method(self) -> bool { - self.field // $ fieldof=MyThing + self.field // $ certainType=self:MyThing fieldof=MyThing } } @@ -365,7 +365,7 @@ mod method_non_parametric_trait_impl { fn type_bound_type_parameter_impl>(thing: TP) -> S1 { // The trait bound on `TP` makes the implementation of `ConvertTo` valid - thing.convert_to() // $ MISSING: target=T::convert_to + thing.convert_to() // $ target=T::convert_to } pub fn f() { @@ -437,7 +437,7 @@ mod method_non_parametric_trait_impl { let x = get_snd_fst(c); // $ type=x:S1 target=get_snd_fst let thing = MyThing { a: S1 }; - let i = thing.convert_to(); // $ MISSING: type=i:S1 target=T::convert_to + let i = thing.convert_to(); // $ type=i:S1 target=T::convert_to let j = convert_to(thing); // $ type=j:S1 target=convert_to } } @@ -1189,20 +1189,20 @@ mod type_aliases { println!("{:?}", p1); // Type can be only inferred from the type alias - let p2: MyPair = PairOption::PairNone(); // $ type=p2:Fst.S1 type=p2:Snd.S2 + let p2: MyPair = PairOption::PairNone(); // $ certainType=p2:Fst.S1 certainType=p2:Snd.S2 println!("{:?}", p2); // First type from alias, second from constructor - let p3: AnotherPair<_> = PairOption::PairSnd(S3); // $ type=p3:Fst.S2 + let p3: AnotherPair<_> = PairOption::PairSnd(S3); // $ certainType=p3:Fst.S2 println!("{:?}", p3); // First type from alias definition, second from argument to alias - let p3: AnotherPair = PairOption::PairNone(); // $ type=p3:Fst.S2 type=p3:Snd.S3 + let p3: AnotherPair = PairOption::PairNone(); // $ certainType=p3:Fst.S2 certainType=p3:Snd.S3 println!("{:?}", p3); g(PairOption::PairSnd(PairOption::PairSnd(S3))); // $ target=g - let x: S7; // $ type=x:Result $ type=x:E.S1 $ type=x:T.S4 $ type=x:T.T41.S2 $ type=x:T.T42.S5 $ type=x:T.T42.T5.S2 + let x: S7; // $ certainType=x:Result $ certainType=x:E.S1 $ certainType=x:T.S4 $ certainType=x:T.T41.S2 $ certainType=x:T.T42.S5 $ certainType=x:T.T42.T5.S2 let y = GenS(true).get_input(); // $ type=y:Result type=y:T.bool type=y:E.bool target=get_input } @@ -1248,7 +1248,7 @@ mod option_methods { struct S; pub fn f() { - let x1 = MyOption::::new(); // $ type=x1:T.S target=new + let x1 = MyOption::::new(); // $ certainType=x1:T.S target=new println!("{:?}", x1); let mut x2 = MyOption::new(); // $ target=new @@ -1376,7 +1376,7 @@ mod method_call_type_conversion { let t = x7.m1(); // $ target=m1 type=t:& type=t:&T.S2 println!("{:?}", x7); - let x9: String = "Hello".to_string(); // $ type=x9:String + let x9: String = "Hello".to_string(); // $ certainType=x9:String target=to_string // Implicit `String` -> `str` conversion happens via the `Deref` trait: // https://doc.rust-lang.org/std/string/struct.String.html#deref. @@ -1551,23 +1551,23 @@ mod try_expressions { mod builtins { pub fn f() { - let x: i32 = 1; // $ type=x:i32 + let x: i32 = 1; // $ certainType=x:i32 let y = 2; // $ type=y:i32 let z = x + y; // $ type=z:i32 target=add let z = x.abs(); // $ target=abs $ type=z:i32 - let c = 'c'; // $ type=c:char - let hello = "Hello"; // $ type=hello:&T.str - let f = 123.0f64; // $ type=f:f64 - let t = true; // $ type=t:bool - let f = false; // $ type=f:bool + let c = 'c'; // $ certainType=c:char + let hello = "Hello"; // $ certainType=hello:&T.str + let f = 123.0f64; // $ certainType=f:f64 + let t = true; // $ certainType=t:bool + let f = false; // $ certainType=f:bool } } // Tests for non-overloaded operators. mod operators { pub fn f() { - let x = true && false; // $ type=x:bool - let y = true || false; // $ type=y:bool + let x = true && false; // $ certainType=x:bool + let y = true || false; // $ certainType=y:bool let mut a; let cond = 34 == 33; // $ target=eq @@ -2341,10 +2341,10 @@ mod loops { let vals2 = [1u16; 3]; // $ type=vals2:[T;...].u16 for u in vals2 {} // $ type=u:u16 - let vals3: [u32; 3] = [1, 2, 3]; // $ type=vals3:[T;...].u32 + let vals3: [u32; 3] = [1, 2, 3]; // $ certainType=vals3:[T;...].u32 for u in vals3 {} // $ type=u:u32 - let vals4: [u64; 3] = [1; 3]; // $ type=vals4:[T;...].u64 + let vals4: [u64; 3] = [1; 3]; // $ certainType=vals4:[T;...].u64 for u in vals4 {} // $ type=u:u64 let mut strings1 = ["foo", "bar", "baz"]; // $ type=strings1:[T;...].&T.str @@ -2379,12 +2379,12 @@ mod loops { for i in 0..10 {} // $ type=i:i32 for u in [0u8..10] {} // $ type=u:Range type=u:Idx.u8 - let range = 0..10; // $ type=range:Range type=range:Idx.i32 + let range = 0..10; // $ certainType=range:Range type=range:Idx.i32 for i in range {} // $ type=i:i32 - let range_full = ..; // $ type=range_full:RangeFull + let range_full = ..; // $ certainType=range_full:RangeFull for i in &[1i64, 2i64, 3i64][range_full] {} // $ target=index MISSING: type=i:&T.i64 - let range1 = // $ type=range1:Range type=range1:Idx.u16 + let range1 = // $ certainType=range1:Range type=range1:Idx.u16 std::ops::Range { start: 0u16, end: 10u16, @@ -2396,19 +2396,19 @@ mod loops { let vals3 = vec![1, 2, 3]; // $ MISSING: type=vals3:Vec type=vals3:T.i32 for i in vals3 {} // $ MISSING: type=i:i32 - let vals4a: Vec = [1u16, 2, 3].to_vec(); // $ type=vals4a:Vec type=vals4a:T.u16 + let vals4a: Vec = [1u16, 2, 3].to_vec(); // $ certainType=vals4a:Vec certainType=vals4a:T.u16 for u in vals4a {} // $ type=u:u16 let vals4b = [1u16, 2, 3].to_vec(); // $ MISSING: type=vals4b:Vec type=vals4b:T.u16 for u in vals4b {} // $ MISSING: type=u:u16 - let vals5 = Vec::from([1u32, 2, 3]); // $ type=vals5:Vec target=from type=vals5:T.u32 + let vals5 = Vec::from([1u32, 2, 3]); // $ certainType=vals5:Vec target=from type=vals5:T.u32 for u in vals5 {} // $ type=u:u32 - let vals6: Vec<&u64> = [1u64, 2, 3].iter().collect(); // $ type=vals6:Vec type=vals6:T.&T.u64 + let vals6: Vec<&u64> = [1u64, 2, 3].iter().collect(); // $ certainType=vals6:Vec certainType=vals6:T.&T.u64 for u in vals6 {} // $ type=u:&T.u64 - let mut vals7 = Vec::new(); // $ target=new type=vals7:Vec type=vals7:T.u8 + let mut vals7 = Vec::new(); // $ target=new certainType=vals7:Vec type=vals7:T.u8 vals7.push(1u8); // $ target=push for u in vals7 {} // $ type=u:u8 @@ -2429,11 +2429,11 @@ mod loops { // while loops - let mut a: i64 = 0; // $ type=a:i64 + let mut a: i64 = 0; // $ certainType=a:i64 #[rustfmt::skip] - let _ = while a < 10 // $ target=lt type=a:i64 + let _ = while a < 10 // $ target=lt certainType=a:i64 { - a += 1; // $ type=a:i64 MISSING: target=add_assign + a += 1; // $ certainType=a:i64 MISSING: target=add_assign }; } } @@ -2471,16 +2471,16 @@ mod explicit_type_args { } pub fn f() { - let x1: Option> = S1::assoc_fun(); // $ type=x1:T.T.S2 target=assoc_fun - let x2 = S1::::assoc_fun(); // $ type=x2:T.T.S2 target=assoc_fun - let x3 = S3::assoc_fun(); // $ type=x3:T.T.S2 target=assoc_fun - let x4 = S1::::method(S1::default()); // $ target=method target=default type=x4:T.S2 - let x5 = S3::method(S1::default()); // $ target=method target=default type=x5:T.S2 + let x1: Option> = S1::assoc_fun(); // $ certainType=x1:T.T.S2 target=assoc_fun + let x2 = S1::::assoc_fun(); // $ certainType=x2:T.T.S2 target=assoc_fun + let x3 = S3::assoc_fun(); // $ certainType=x3:T.T.S2 target=assoc_fun + let x4 = S1::::method(S1::default()); // $ target=method target=default certainType=x4:T.S2 + let x5 = S3::method(S1::default()); // $ target=method target=default certainType=x5:T.S2 let x6 = S4::(Default::default()); // $ type=x6:T4.S2 target=default let x7 = S4(S2); // $ type=x7:T4.S2 let x8 = S4(0); // $ type=x8:T4.i32 let x9 = S4(S2::default()); // $ type=x9:T4.S2 target=default - let x10 = S5:: // $ type=x10:T5.S2 + let x10 = S5:: // $ certainType=x10:T5.S2 { field: Default::default(), // $ target=default }; @@ -2490,7 +2490,7 @@ mod explicit_type_args { { field: S2::default(), // $ target=default }; - let x14 = foo::(Default::default()); // $ type=x14:i32 target=default target=foo + let x14 = foo::(Default::default()); // $ certainType=x14:i32 target=default target=foo } } @@ -2506,8 +2506,8 @@ mod tuples { } pub fn f() { - let a = S1::get_pair(); // $ target=get_pair type=a:(T_2) - let mut b = S1::get_pair(); // $ target=get_pair type=b:(T_2) + let a = S1::get_pair(); // $ target=get_pair certainType=a:(T_2) + let mut b = S1::get_pair(); // $ target=get_pair certainType=b:(T_2) let (c, d) = S1::get_pair(); // $ target=get_pair type=c:S1 type=d:S1 let (mut e, f) = S1::get_pair(); // $ target=get_pair type=e:S1 type=f:S1 let (mut g, mut h) = S1::get_pair(); // $ target=get_pair type=g:S1 type=h:S1 @@ -2569,43 +2569,6 @@ pub mod pattern_matching_experimental { } } -pub mod exec { - // a highly simplified model of `MySqlConnection.execute` in SQLx - - trait Connection {} - - trait Executor { - fn execute1(&self); - fn execute2(&self, query: E); - } - - impl Executor for T { - fn execute1(&self) { - println!("Executor::execute1"); - } - - fn execute2(&self, _query: E) { - println!("Executor::execute2"); - } - } - - struct MySqlConnection {} - - impl Connection for MySqlConnection {} - - pub fn f() { - let c = MySqlConnection {}; // $ type=c:MySqlConnection - - c.execute1(); // $ MISSING: target=execute1 - MySqlConnection::execute1(&c); // $ MISSING: target=execute1 - - c.execute2("SELECT * FROM users"); // $ MISSING: target=execute2 - c.execute2::<&str>("SELECT * FROM users"); // $ MISSING: target=execute2 - MySqlConnection::execute2(&c, "SELECT * FROM users"); // $ MISSING: target=execute2 - MySqlConnection::execute2::<&str>(&c, "SELECT * FROM users"); // $ MISSING: target=execute2 - } -} - pub mod path_buf { // a highly simplified model of `PathBuf::canonicalize` @@ -2642,11 +2605,11 @@ pub mod path_buf { } pub fn f() { - let path1 = Path::new(); // $ target=new type=path1:Path + let path1 = Path::new(); // $ target=new certainType=path1:Path let path2 = path1.canonicalize(); // $ target=canonicalize let path3 = path2.unwrap(); // $ target=unwrap type=path3:PathBuf - let pathbuf1 = PathBuf::new(); // $ target=new type=pathbuf1:PathBuf + let pathbuf1 = PathBuf::new(); // $ target=new certainType=pathbuf1:PathBuf let pathbuf2 = pathbuf1.canonicalize(); // $ MISSING: target=canonicalize let pathbuf3 = pathbuf2.unwrap(); // $ MISSING: target=unwrap type=pathbuf3:PathBuf } @@ -2655,6 +2618,7 @@ pub mod path_buf { mod closure; mod dereference; mod dyn_type; +mod blanket_impl; fn main() { field_access::f(); // $ target=f @@ -2683,7 +2647,6 @@ fn main() { macros::f(); // $ target=f method_determined_by_argument_type::f(); // $ target=f tuples::f(); // $ target=f - exec::f(); // $ target=f path_buf::f(); // $ target=f dereference::test(); // $ target=test pattern_matching::test_all_patterns(); // $ target=test_all_patterns diff --git a/rust/ql/test/library-tests/type-inference/pattern_matching.rs b/rust/ql/test/library-tests/type-inference/pattern_matching.rs index 30ddd61444e7..569b06ab9a7e 100755 --- a/rust/ql/test/library-tests/type-inference/pattern_matching.rs +++ b/rust/ql/test/library-tests/type-inference/pattern_matching.rs @@ -171,15 +171,15 @@ pub fn literal_patterns() { match value { // LiteralPat - Literal patterns (including negative literals) 42 => { - let literal_match = value; // $ type=literal_match:i32 + let literal_match = value; // $ certainType=literal_match:i32 println!("Literal pattern: {}", literal_match); } -1 => { - let negative_literal = value; // $ type=negative_literal:i32 + let negative_literal = value; // $ certainType=negative_literal:i32 println!("Negative literal: {}", negative_literal); } 0 => { - let zero_literal = value; // $ type=zero_literal:i32 + let zero_literal = value; // $ certainType=zero_literal:i32 println!("Zero literal: {}", zero_literal); } _ => {} @@ -188,7 +188,7 @@ pub fn literal_patterns() { let float_val = 3.14f64; match float_val { 3.14 => { - let pi_match = float_val; // $ type=pi_match:f64 + let pi_match = float_val; // $ certainType=pi_match:f64 println!("Pi matched: {}", pi_match); } _ => {} @@ -197,7 +197,7 @@ pub fn literal_patterns() { let string_val = "hello"; match string_val { "hello" => { - let hello_match = string_val; // $ type=hello_match:&T.str + let hello_match = string_val; // $ certainType=hello_match:&T.str println!("String literal: {}", hello_match); } _ => {} @@ -206,11 +206,11 @@ pub fn literal_patterns() { let bool_val = true; match bool_val { true => { - let true_match = bool_val; // $ type=true_match:bool + let true_match = bool_val; // $ certainType=true_match:bool println!("True literal: {}", true_match); } false => { - let false_match = bool_val; // $ type=false_match:bool + let false_match = bool_val; // $ certainType=false_match:bool println!("False literal: {}", false_match); } } @@ -283,7 +283,7 @@ pub fn wildcard_patterns() { 42 => println!("Specific match"), // WildcardPat - Wildcard pattern _ => { - let wildcard_context = value; // $ type=wildcard_context:i32 + let wildcard_context = value; // $ certainType=wildcard_context:i32 println!("Wildcard pattern for: {}", wildcard_context); } } @@ -295,15 +295,15 @@ pub fn range_patterns() { match value { // RangePat - Range patterns 1..=10 => { - let range_inclusive = value; // $ type=range_inclusive:i32 + let range_inclusive = value; // $ certainType=range_inclusive:i32 println!("Range inclusive: {}", range_inclusive); } 11.. => { - let range_from = value; // $ type=range_from:i32 + let range_from = value; // $ certainType=range_from:i32 println!("Range from 11: {}", range_from); } ..=0 => { - let range_to_inclusive = value; // $ type=range_to_inclusive:i32 + let range_to_inclusive = value; // $ certainType=range_to_inclusive:i32 println!("Range to 0 inclusive: {}", range_to_inclusive); } _ => {} @@ -312,11 +312,11 @@ pub fn range_patterns() { let char_val = 'c'; match char_val { 'a'..='z' => { - let lowercase_char = char_val; // $ type=lowercase_char:char + let lowercase_char = char_val; // $ certainType=lowercase_char:char println!("Lowercase char: {}", lowercase_char); } 'A'..='Z' => { - let uppercase_char = char_val; // $ type=uppercase_char:char + let uppercase_char = char_val; // $ certainType=uppercase_char:char println!("Uppercase char: {}", uppercase_char); } _ => {} @@ -330,7 +330,7 @@ pub fn reference_patterns() { // RefPat - Reference patterns match &value { &42 => { - let deref_match = value; // $ type=deref_match:i32 + let deref_match = value; // $ certainType=deref_match:i32 println!("Dereferenced match: {}", deref_match); } &x => { @@ -360,16 +360,16 @@ pub fn record_patterns() { // RecordPat - Record (struct) patterns match point { Point { x: 0, y: 0 } => { - let origin = point; // $ type=origin:Point + let origin = point; // $ certainType=origin:Point println!("Origin point: {:?}", origin); } Point { x, y: 0 } => { let x_axis_x = x; // $ type=x_axis_x:i32 - let x_axis_point = point; // $ type=x_axis_point:Point + let x_axis_point = point; // $ certainType=x_axis_point:Point println!("Point on x-axis: x={}, point={:?}", x_axis_x, x_axis_point); } Point { x: 10, .. } => { - let ten_x_point = point; // $ type=ten_x_point:Point + let ten_x_point = point; // $ certainType=ten_x_point:Point println!("Point with x=10: {:?}", ten_x_point); } Point { x, y } => { @@ -446,7 +446,7 @@ pub fn tuple_patterns() { // TuplePat - Tuple patterns match tuple { (1, 2, 3.0) => { - let exact_tuple = tuple; // $ type=exact_tuple:(T_3) + let exact_tuple = tuple; // $ certainType=exact_tuple:(T_3) println!("Exact tuple: {:?}", exact_tuple); } (a, b, c) => { @@ -469,7 +469,7 @@ pub fn tuple_patterns() { let unit = (); match unit { () => { - let unit_value = unit; // $ type=unit_value:() + let unit_value = unit; // $ certainType=unit_value:() println!("Unit value: {:?}", unit_value); } } @@ -525,7 +525,7 @@ pub fn slice_patterns() { // SlicePat - Slice patterns match slice { [] => { - let empty_slice = slice; // $ type=empty_slice:&T.[T].i32 + let empty_slice = slice; // $ certainType=empty_slice:&T.[T].i32 println!("Empty slice: {:?}", empty_slice); } [x] => { @@ -569,7 +569,7 @@ pub fn path_patterns() { match value { CONSTANT => { - let const_match = value; // $ type=const_match:i32 + let const_match = value; // $ certainType=const_match:i32 println!("Matches constant: {}", const_match); } _ => {} @@ -606,11 +606,11 @@ pub fn or_patterns() { // OrPat - Or patterns match value { 1 | 2 | 3 => { - let small_num = value; // $ type=small_num:i32 + let small_num = value; // $ certainType=small_num:i32 println!("Small number: {}", small_num); } 10 | 20 => { - let round_num = value; // $ type=round_num:i32 + let round_num = value; // $ certainType=round_num:i32 println!("Round number: {}", round_num); } _ => {} @@ -630,7 +630,7 @@ pub fn or_patterns() { // Or pattern with ranges match value { 1..=10 | 90..=100 => { - let range_or_value = value; // $ type=range_or_value:i32 + let range_or_value = value; // $ certainType=range_or_value:i32 println!("In range: {}", range_or_value); } _ => {} @@ -750,11 +750,11 @@ pub fn patterns_in_let_statements() { // Let with reference pattern let value = 42i32; let ref ref_val = value; - let let_ref = ref_val; // $ type=let_ref:&T.i32 + let let_ref = ref_val; // $ certainType=let_ref:&T.i32 // Let with mutable pattern let mut mut_val = 10i32; - let let_mut = mut_val; // $ type=let_mut:i32 + let let_mut = mut_val; // $ certainType=let_mut:i32 } pub fn patterns_in_function_parameters() { @@ -779,13 +779,13 @@ pub fn patterns_in_function_parameters() { // Call the functions to use them let point = Point { x: 5, y: 10 }; - let extracted = extract_point(point); // $ target=extract_point type=extracted:0(2).i32 type=extracted:1(2).i32 + let extracted = extract_point(point); // $ target=extract_point certainType=extracted:0(2).i32 certainType=extracted:1(2).i32 let color = Color(200, 100, 50); - let red = extract_color(color); // $ target=extract_color type=red:u8 + let red = extract_color(color); // $ target=extract_color certainType=red:u8 let tuple = (42i32, 3.14f64, true); - let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple type=tuple_extracted:0(2).i32 type=tuple_extracted:1(2).bool + let tuple_extracted = extract_tuple(tuple); // $ target=extract_tuple certainType=tuple_extracted:0(2).i32 certainType=tuple_extracted:1(2).bool } #[rustfmt::skip] diff --git a/rust/ql/test/library-tests/type-inference/type-inference.expected b/rust/ql/test/library-tests/type-inference/type-inference.expected index 158af57728ff..1a9a6456ce8d 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.expected +++ b/rust/ql/test/library-tests/type-inference/type-inference.expected @@ -1,4 +1,143 @@ inferType +| blanket_impl.rs:8:19:8:23 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:8:19:8:23 | SelfParam | &T | blanket_impl.rs:7:5:9:5 | Self [trait Clone1] | +| blanket_impl.rs:12:22:12:26 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:12:22:12:26 | SelfParam | &T | blanket_impl.rs:11:5:15:5 | Self [trait Duplicatable] | +| blanket_impl.rs:19:19:19:23 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:19:19:19:23 | SelfParam | &T | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:19:34:21:9 | { ... } | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:20:13:20:17 | * ... | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:20:14:20:17 | self | | file://:0:0:0:0 | & | +| blanket_impl.rs:20:14:20:17 | self | &T | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:27:22:27:26 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:27:22:27:26 | SelfParam | &T | blanket_impl.rs:25:10:25:18 | T | +| blanket_impl.rs:27:37:29:9 | { ... } | | blanket_impl.rs:25:10:25:18 | T | +| blanket_impl.rs:28:13:28:16 | self | | file://:0:0:0:0 | & | +| blanket_impl.rs:28:13:28:16 | self | &T | blanket_impl.rs:25:10:25:18 | T | +| blanket_impl.rs:28:13:28:25 | self.clone1() | | blanket_impl.rs:25:10:25:18 | T | +| blanket_impl.rs:33:13:33:13 | x | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:33:17:33:18 | S1 | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:33:17:33:27 | S1.clone1() | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:34:18:34:24 | "{x:?}\\n" | | file://:0:0:0:0 | & | +| blanket_impl.rs:34:18:34:24 | "{x:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:34:18:34:24 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| blanket_impl.rs:34:18:34:24 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| blanket_impl.rs:34:20:34:20 | x | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:35:13:35:13 | y | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:35:17:35:18 | S1 | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:35:17:35:30 | S1.duplicate() | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:36:18:36:24 | "{y:?}\\n" | | file://:0:0:0:0 | & | +| blanket_impl.rs:36:18:36:24 | "{y:?}\\n" | &T | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:36:18:36:24 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| blanket_impl.rs:36:18:36:24 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| blanket_impl.rs:36:20:36:20 | y | | blanket_impl.rs:4:5:5:14 | S1 | +| blanket_impl.rs:47:22:47:26 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:47:22:47:26 | SelfParam | &T | blanket_impl.rs:46:5:48:5 | Self [trait Flag] | +| blanket_impl.rs:51:26:51:30 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:51:26:51:30 | SelfParam | &T | blanket_impl.rs:50:5:52:5 | Self [trait TryFlag] | +| blanket_impl.rs:58:26:58:30 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:58:26:58:30 | SelfParam | &T | blanket_impl.rs:54:10:54:11 | Fl | +| blanket_impl.rs:58:49:60:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:58:49:60:9 | { ... } | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:59:13:59:34 | Some(...) | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:59:13:59:34 | Some(...) | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:59:18:59:21 | self | | file://:0:0:0:0 | & | +| blanket_impl.rs:59:18:59:21 | self | &T | blanket_impl.rs:54:10:54:11 | Fl | +| blanket_impl.rs:59:18:59:33 | self.read_flag() | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:65:32:65:36 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:65:32:65:36 | SelfParam | &T | blanket_impl.rs:63:5:68:5 | Self [trait TryFlagExt] | +| blanket_impl.rs:65:55:67:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:65:55:67:9 | { ... } | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:66:13:66:16 | self | | file://:0:0:0:0 | & | +| blanket_impl.rs:66:13:66:16 | self | &T | blanket_impl.rs:63:5:68:5 | Self [trait TryFlagExt] | +| blanket_impl.rs:66:13:66:32 | self.try_read_flag() | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:66:13:66:32 | self.try_read_flag() | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:74:32:74:36 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:74:32:74:36 | SelfParam | &T | blanket_impl.rs:72:5:75:5 | Self [trait AnotherTryFlag] | +| blanket_impl.rs:83:26:83:30 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:83:26:83:30 | SelfParam | &T | blanket_impl.rs:77:5:79:5 | MyTryFlag | +| blanket_impl.rs:83:49:85:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:83:49:85:9 | { ... } | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:84:13:84:27 | Some(...) | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:84:13:84:27 | Some(...) | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:84:18:84:21 | self | | file://:0:0:0:0 | & | +| blanket_impl.rs:84:18:84:21 | self | &T | blanket_impl.rs:77:5:79:5 | MyTryFlag | +| blanket_impl.rs:84:18:84:26 | self.flag | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:94:22:94:26 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:94:22:94:26 | SelfParam | &T | blanket_impl.rs:88:5:90:5 | MyFlag | +| blanket_impl.rs:94:37:96:9 | { ... } | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:95:13:95:16 | self | | file://:0:0:0:0 | & | +| blanket_impl.rs:95:13:95:16 | self | &T | blanket_impl.rs:88:5:90:5 | MyFlag | +| blanket_impl.rs:95:13:95:21 | self.flag | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:105:32:105:36 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:105:32:105:36 | SelfParam | &T | blanket_impl.rs:99:5:101:5 | MyOtherFlag | +| blanket_impl.rs:105:55:107:9 | { ... } | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:105:55:107:9 | { ... } | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:106:13:106:27 | Some(...) | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:106:13:106:27 | Some(...) | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:106:18:106:21 | self | | file://:0:0:0:0 | & | +| blanket_impl.rs:106:18:106:21 | self | &T | blanket_impl.rs:99:5:101:5 | MyOtherFlag | +| blanket_impl.rs:106:18:106:26 | self.flag | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:111:13:111:23 | my_try_flag | | blanket_impl.rs:77:5:79:5 | MyTryFlag | +| blanket_impl.rs:111:27:111:50 | MyTryFlag {...} | | blanket_impl.rs:77:5:79:5 | MyTryFlag | +| blanket_impl.rs:111:45:111:48 | true | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:112:13:112:18 | result | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:112:13:112:18 | result | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:112:22:112:32 | my_try_flag | | blanket_impl.rs:77:5:79:5 | MyTryFlag | +| blanket_impl.rs:112:22:112:54 | my_try_flag.try_read_flag_twice() | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:112:22:112:54 | my_try_flag.try_read_flag_twice() | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:114:13:114:19 | my_flag | | blanket_impl.rs:88:5:90:5 | MyFlag | +| blanket_impl.rs:114:23:114:43 | MyFlag {...} | | blanket_impl.rs:88:5:90:5 | MyFlag | +| blanket_impl.rs:114:38:114:41 | true | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:117:22:117:28 | my_flag | | blanket_impl.rs:88:5:90:5 | MyFlag | +| blanket_impl.rs:119:13:119:25 | my_other_flag | | blanket_impl.rs:99:5:101:5 | MyOtherFlag | +| blanket_impl.rs:119:29:119:54 | MyOtherFlag {...} | | blanket_impl.rs:99:5:101:5 | MyOtherFlag | +| blanket_impl.rs:119:49:119:52 | true | | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:122:13:122:18 | result | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:122:13:122:18 | result | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:122:22:122:34 | my_other_flag | | blanket_impl.rs:99:5:101:5 | MyOtherFlag | +| blanket_impl.rs:122:22:122:56 | my_other_flag.try_read_flag_twice() | | {EXTERNAL LOCATION} | Option | +| blanket_impl.rs:122:22:122:56 | my_other_flag.try_read_flag_twice() | T | {EXTERNAL LOCATION} | bool | +| blanket_impl.rs:132:21:132:25 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:132:21:132:25 | SelfParam | &T | blanket_impl.rs:131:5:134:5 | Self [trait Executor] | +| blanket_impl.rs:133:24:133:28 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:133:24:133:28 | SelfParam | &T | blanket_impl.rs:131:5:134:5 | Self [trait Executor] | +| blanket_impl.rs:133:31:133:35 | query | | blanket_impl.rs:133:21:133:21 | E | +| blanket_impl.rs:137:21:137:25 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:137:21:137:25 | SelfParam | &T | blanket_impl.rs:136:10:136:22 | T | +| blanket_impl.rs:138:22:138:41 | "Executor::execute1\\n" | | file://:0:0:0:0 | & | +| blanket_impl.rs:138:22:138:41 | "Executor::execute1\\n" | &T | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:138:22:138:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| blanket_impl.rs:138:22:138:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| blanket_impl.rs:141:24:141:28 | SelfParam | | file://:0:0:0:0 | & | +| blanket_impl.rs:141:24:141:28 | SelfParam | &T | blanket_impl.rs:136:10:136:22 | T | +| blanket_impl.rs:141:31:141:36 | _query | | blanket_impl.rs:141:21:141:21 | E | +| blanket_impl.rs:142:22:142:41 | "Executor::execute2\\n" | | file://:0:0:0:0 | & | +| blanket_impl.rs:142:22:142:41 | "Executor::execute2\\n" | &T | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:142:22:142:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | +| blanket_impl.rs:142:22:142:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | +| blanket_impl.rs:151:13:151:13 | c | | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:151:17:151:34 | MySqlConnection {...} | | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:153:9:153:9 | c | | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:154:35:154:36 | &c | | file://:0:0:0:0 | & | +| blanket_impl.rs:154:35:154:36 | &c | &T | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:154:36:154:36 | c | | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:156:9:156:9 | c | | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:156:20:156:40 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| blanket_impl.rs:156:20:156:40 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:157:9:157:9 | c | | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:157:28:157:48 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| blanket_impl.rs:157:28:157:48 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:158:35:158:36 | &c | | file://:0:0:0:0 | & | +| blanket_impl.rs:158:35:158:36 | &c | &T | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:158:36:158:36 | c | | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:158:39:158:59 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| blanket_impl.rs:158:39:158:59 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | +| blanket_impl.rs:159:43:159:44 | &c | | file://:0:0:0:0 | & | +| blanket_impl.rs:159:43:159:44 | &c | &T | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:159:44:159:44 | c | | blanket_impl.rs:146:5:146:29 | MySqlConnection | +| blanket_impl.rs:159:47:159:67 | "SELECT * FROM users" | | file://:0:0:0:0 | & | +| blanket_impl.rs:159:47:159:67 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | | closure.rs:6:13:6:22 | my_closure | | {EXTERNAL LOCATION} | dyn FnOnce | | closure.rs:6:13:6:22 | my_closure | dyn(Args) | file://:0:0:0:0 | (T_2) | | closure.rs:6:13:6:22 | my_closure | dyn(Args).0(2) | {EXTERNAL LOCATION} | bool | @@ -117,9 +256,9 @@ inferType | closure.rs:45:9:45:9 | f | | closure.rs:44:20:44:36 | F | | closure.rs:45:9:45:12 | f(...) | | closure.rs:44:17:44:17 | B | | closure.rs:45:11:45:11 | a | | closure.rs:44:14:44:14 | A | -| closure.rs:48:18:48:18 | f | | closure.rs:48:21:48:43 | ImplTraitTypeRepr | +| closure.rs:48:18:48:18 | f | | closure.rs:48:21:48:43 | impl ... | | closure.rs:48:53:50:5 | { ... } | | {EXTERNAL LOCATION} | i64 | -| closure.rs:49:9:49:9 | f | | closure.rs:48:21:48:43 | ImplTraitTypeRepr | +| closure.rs:49:9:49:9 | f | | closure.rs:48:21:48:43 | impl ... | | closure.rs:49:9:49:12 | f(...) | | {EXTERNAL LOCATION} | i64 | | closure.rs:49:11:49:11 | 2 | | {EXTERNAL LOCATION} | i32 | | closure.rs:49:11:49:11 | 2 | | {EXTERNAL LOCATION} | i64 | @@ -385,8 +524,6 @@ inferType | dereference.rs:122:23:122:29 | &... | &T | file://:0:0:0:0 | & | | dereference.rs:122:23:122:29 | &... | &T.&T | dereference.rs:99:5:100:21 | Key | | dereference.rs:122:24:122:29 | Key {...} | | dereference.rs:99:5:100:21 | Key | -| dereference.rs:122:24:122:29 | Key {...} | | file://:0:0:0:0 | & | -| dereference.rs:122:24:122:29 | Key {...} | &T | dereference.rs:99:5:100:21 | Key | | dereference.rs:123:16:123:28 | Some(...) | | {EXTERNAL LOCATION} | Option | | dereference.rs:123:16:123:28 | Some(...) | T | file://:0:0:0:0 | & | | dereference.rs:123:16:123:28 | Some(...) | T.&T | dereference.rs:99:5:100:21 | Key | @@ -501,10 +638,8 @@ inferType | dyn_type.rs:61:5:61:36 | ...::new(...) | T | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:61:5:61:36 | ...::new(...) | T.A | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:61:5:61:36 | ...::new(...) | T.dyn(A) | dyn_type.rs:60:18:60:43 | A | -| dyn_type.rs:61:14:61:35 | GenStruct {...} | | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:61:14:61:35 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:61:14:61:35 | GenStruct {...} | A | dyn_type.rs:60:18:60:43 | A | -| dyn_type.rs:61:14:61:35 | GenStruct {...} | dyn(A) | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:61:33:61:33 | a | | dyn_type.rs:60:18:60:43 | A | | dyn_type.rs:64:25:64:27 | obj | | file://:0:0:0:0 | & | | dyn_type.rs:64:25:64:27 | obj | &T | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | @@ -623,29 +758,26 @@ inferType | dyn_type.rs:102:26:102:48 | &... | | file://:0:0:0:0 | & | | dyn_type.rs:102:26:102:48 | &... | &T | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | | dyn_type.rs:102:26:102:48 | &... | &T | dyn_type.rs:21:1:24:1 | MyStruct | -| dyn_type.rs:102:27:102:48 | MyStruct {...} | | dyn_type.rs:5:1:8:1 | dyn MyTrait1 | | dyn_type.rs:102:27:102:48 | MyStruct {...} | | dyn_type.rs:21:1:24:1 | MyStruct | | dyn_type.rs:102:45:102:46 | 42 | | {EXTERNAL LOCATION} | i32 | | dyn_type.rs:103:28:105:5 | &... | | file://:0:0:0:0 | & | | dyn_type.rs:103:28:105:5 | &... | &T | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:103:28:105:5 | &... | &T | dyn_type.rs:33:1:36:1 | GenStruct | +| dyn_type.rs:103:28:105:5 | &... | &T.A | {EXTERNAL LOCATION} | String | | dyn_type.rs:103:28:105:5 | &... | &T.dyn(A) | {EXTERNAL LOCATION} | String | -| dyn_type.rs:103:29:105:5 | GenStruct {...} | | dyn_type.rs:10:1:13:1 | dyn GenericGet | | dyn_type.rs:103:29:105:5 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | -| dyn_type.rs:103:29:105:5 | GenStruct {...} | dyn(A) | {EXTERNAL LOCATION} | String | +| dyn_type.rs:103:29:105:5 | GenStruct {...} | A | {EXTERNAL LOCATION} | String | | dyn_type.rs:104:16:104:17 | "" | | file://:0:0:0:0 | & | | dyn_type.rs:104:16:104:17 | "" | &T | {EXTERNAL LOCATION} | str | +| dyn_type.rs:104:16:104:29 | "".to_string() | | {EXTERNAL LOCATION} | String | | dyn_type.rs:107:21:107:45 | &... | | file://:0:0:0:0 | & | | dyn_type.rs:107:21:107:45 | &... | &T | dyn_type.rs:15:1:19:1 | dyn AssocTrait | | dyn_type.rs:107:21:107:45 | &... | &T | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:107:21:107:45 | &... | &T.A | {EXTERNAL LOCATION} | i32 | | dyn_type.rs:107:21:107:45 | &... | &T.dyn(AP) | {EXTERNAL LOCATION} | bool | | dyn_type.rs:107:21:107:45 | &... | &T.dyn(GP) | {EXTERNAL LOCATION} | i64 | -| dyn_type.rs:107:22:107:45 | GenStruct {...} | | dyn_type.rs:15:1:19:1 | dyn AssocTrait | | dyn_type.rs:107:22:107:45 | GenStruct {...} | | dyn_type.rs:33:1:36:1 | GenStruct | | dyn_type.rs:107:22:107:45 | GenStruct {...} | A | {EXTERNAL LOCATION} | i32 | -| dyn_type.rs:107:22:107:45 | GenStruct {...} | dyn(AP) | {EXTERNAL LOCATION} | bool | -| dyn_type.rs:107:22:107:45 | GenStruct {...} | dyn(GP) | {EXTERNAL LOCATION} | i64 | | dyn_type.rs:107:41:107:43 | 100 | | {EXTERNAL LOCATION} | i32 | | loop/main.rs:7:12:7:15 | SelfParam | | loop/main.rs:6:1:8:1 | Self [trait T1] | | loop/main.rs:11:12:11:15 | SelfParam | | loop/main.rs:10:1:14:1 | Self [trait T2] | @@ -1270,8 +1402,10 @@ inferType | main.rs:439:21:439:37 | MyThing {...} | | main.rs:224:5:227:5 | MyThing | | main.rs:439:21:439:37 | MyThing {...} | A | main.rs:235:5:236:14 | S1 | | main.rs:439:34:439:35 | S1 | | main.rs:235:5:236:14 | S1 | +| main.rs:440:13:440:13 | i | | main.rs:235:5:236:14 | S1 | | main.rs:440:17:440:21 | thing | | main.rs:224:5:227:5 | MyThing | | main.rs:440:17:440:21 | thing | A | main.rs:235:5:236:14 | S1 | +| main.rs:440:17:440:34 | thing.convert_to() | | main.rs:235:5:236:14 | S1 | | main.rs:441:13:441:13 | j | | main.rs:235:5:236:14 | S1 | | main.rs:441:17:441:33 | convert_to(...) | | main.rs:235:5:236:14 | S1 | | main.rs:441:28:441:32 | thing | | main.rs:224:5:227:5 | MyThing | @@ -2467,7 +2601,6 @@ inferType | main.rs:1328:33:1328:36 | SelfParam | | main.rs:1326:5:1329:5 | Self [trait ATrait] | | main.rs:1334:29:1334:33 | SelfParam | | file://:0:0:0:0 | & | | main.rs:1334:29:1334:33 | SelfParam | &T | file://:0:0:0:0 | & | -| main.rs:1334:29:1334:33 | SelfParam | &T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1334:29:1334:33 | SelfParam | &T.&T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1334:43:1336:9 | { ... } | | {EXTERNAL LOCATION} | i64 | | main.rs:1335:13:1335:22 | (...) | | main.rs:1307:5:1310:5 | MyInt | @@ -2481,7 +2614,6 @@ inferType | main.rs:1335:16:1335:20 | * ... | &T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:17:1335:20 | self | | file://:0:0:0:0 | & | | main.rs:1335:17:1335:20 | self | &T | file://:0:0:0:0 | & | -| main.rs:1335:17:1335:20 | self | &T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1335:17:1335:20 | self | &T.&T | main.rs:1307:5:1310:5 | MyInt | | main.rs:1339:33:1339:36 | SelfParam | | file://:0:0:0:0 | & | | main.rs:1339:33:1339:36 | SelfParam | &T | main.rs:1307:5:1310:5 | MyInt | @@ -3199,14 +3331,22 @@ inferType | main.rs:1706:13:1709:13 | Vec2 {...} | | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1707:20:1707:23 | self | | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1707:20:1707:25 | self.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1707:20:1707:33 | ... \| ... | | {EXTERNAL LOCATION} | NonZero | | main.rs:1707:20:1707:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1707:20:1707:33 | ... \| ... | T | {EXTERNAL LOCATION} | i64 | | main.rs:1707:29:1707:31 | rhs | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1707:29:1707:33 | rhs.x | | {EXTERNAL LOCATION} | NonZero | | main.rs:1707:29:1707:33 | rhs.x | | {EXTERNAL LOCATION} | i64 | +| main.rs:1707:29:1707:33 | rhs.x | T | {EXTERNAL LOCATION} | i64 | | main.rs:1708:20:1708:23 | self | | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1708:20:1708:25 | self.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1708:20:1708:33 | ... \| ... | | {EXTERNAL LOCATION} | NonZero | | main.rs:1708:20:1708:33 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1708:20:1708:33 | ... \| ... | T | {EXTERNAL LOCATION} | i64 | | main.rs:1708:29:1708:31 | rhs | | main.rs:1586:5:1591:5 | Vec2 | +| main.rs:1708:29:1708:33 | rhs.y | | {EXTERNAL LOCATION} | NonZero | | main.rs:1708:29:1708:33 | rhs.y | | {EXTERNAL LOCATION} | i64 | +| main.rs:1708:29:1708:33 | rhs.y | T | {EXTERNAL LOCATION} | i64 | | main.rs:1714:25:1714:33 | SelfParam | | file://:0:0:0:0 | & | | main.rs:1714:25:1714:33 | SelfParam | &T | main.rs:1586:5:1591:5 | Vec2 | | main.rs:1714:36:1714:38 | rhs | | main.rs:1586:5:1591:5 | Vec2 | @@ -3544,9 +3684,13 @@ inferType | main.rs:1857:26:1857:30 | 33i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1857:26:1857:38 | ... & ... | | {EXTERNAL LOCATION} | i64 | | main.rs:1857:34:1857:38 | 34i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1858:13:1858:21 | i64_bitor | | {EXTERNAL LOCATION} | NonZero | | main.rs:1858:13:1858:21 | i64_bitor | | {EXTERNAL LOCATION} | i64 | +| main.rs:1858:13:1858:21 | i64_bitor | T | {EXTERNAL LOCATION} | i64 | | main.rs:1858:25:1858:29 | 35i64 | | {EXTERNAL LOCATION} | i64 | +| main.rs:1858:25:1858:37 | ... \| ... | | {EXTERNAL LOCATION} | NonZero | | main.rs:1858:25:1858:37 | ... \| ... | | {EXTERNAL LOCATION} | i64 | +| main.rs:1858:25:1858:37 | ... \| ... | T | {EXTERNAL LOCATION} | i64 | | main.rs:1858:33:1858:37 | 36i64 | | {EXTERNAL LOCATION} | i64 | | main.rs:1859:13:1859:22 | i64_bitxor | | {EXTERNAL LOCATION} | i64 | | main.rs:1859:26:1859:30 | 37i64 | | {EXTERNAL LOCATION} | i64 | @@ -3746,7 +3890,7 @@ inferType | main.rs:1961:18:1961:21 | SelfParam | | main.rs:1958:5:1958:14 | S1 | | main.rs:1964:25:1966:5 | { ... } | | main.rs:1958:5:1958:14 | S1 | | main.rs:1965:9:1965:10 | S1 | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1968:41:1970:5 | { ... } | | main.rs:1968:16:1968:39 | ImplTraitTypeRepr | +| main.rs:1968:41:1970:5 | { ... } | | main.rs:1968:16:1968:39 | impl ... | | main.rs:1969:9:1969:20 | { ... } | | {EXTERNAL LOCATION} | trait Future | | main.rs:1969:9:1969:20 | { ... } | Output | main.rs:1958:5:1958:14 | S1 | | main.rs:1969:17:1969:18 | S1 | | main.rs:1958:5:1958:14 | S1 | @@ -3760,15 +3904,15 @@ inferType | main.rs:1981:13:1981:38 | ...::Ready(...) | | {EXTERNAL LOCATION} | Poll | | main.rs:1981:13:1981:38 | ...::Ready(...) | T | main.rs:1958:5:1958:14 | S1 | | main.rs:1981:36:1981:37 | S1 | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1985:41:1987:5 | { ... } | | main.rs:1985:16:1985:39 | ImplTraitTypeRepr | +| main.rs:1985:41:1987:5 | { ... } | | main.rs:1985:16:1985:39 | impl ... | | main.rs:1986:9:1986:10 | S2 | | main.rs:1972:5:1972:14 | S2 | -| main.rs:1986:9:1986:10 | S2 | | main.rs:1985:16:1985:39 | ImplTraitTypeRepr | +| main.rs:1986:9:1986:10 | S2 | | main.rs:1985:16:1985:39 | impl ... | | main.rs:1990:9:1990:12 | f1(...) | | {EXTERNAL LOCATION} | trait Future | | main.rs:1990:9:1990:12 | f1(...) | Output | main.rs:1958:5:1958:14 | S1 | | main.rs:1990:9:1990:18 | await ... | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1991:9:1991:12 | f2(...) | | main.rs:1968:16:1968:39 | ImplTraitTypeRepr | +| main.rs:1991:9:1991:12 | f2(...) | | main.rs:1968:16:1968:39 | impl ... | | main.rs:1991:9:1991:18 | await ... | | main.rs:1958:5:1958:14 | S1 | -| main.rs:1992:9:1992:12 | f3(...) | | main.rs:1985:16:1985:39 | ImplTraitTypeRepr | +| main.rs:1992:9:1992:12 | f3(...) | | main.rs:1985:16:1985:39 | impl ... | | main.rs:1992:9:1992:18 | await ... | | main.rs:1958:5:1958:14 | S1 | | main.rs:1993:9:1993:10 | S2 | | main.rs:1972:5:1972:14 | S2 | | main.rs:1993:9:1993:16 | await S2 | | main.rs:1958:5:1958:14 | S1 | @@ -3788,9 +3932,9 @@ inferType | main.rs:2014:15:2014:19 | SelfParam | &T | main.rs:2000:5:2001:14 | S1 | | main.rs:2018:15:2018:19 | SelfParam | | file://:0:0:0:0 | & | | main.rs:2018:15:2018:19 | SelfParam | &T | main.rs:2000:5:2001:14 | S1 | -| main.rs:2021:37:2023:5 | { ... } | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | +| main.rs:2021:37:2023:5 | { ... } | | main.rs:2021:16:2021:35 | impl ... + ... | | main.rs:2022:9:2022:10 | S1 | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2022:9:2022:10 | S1 | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | +| main.rs:2022:9:2022:10 | S1 | | main.rs:2021:16:2021:35 | impl ... + ... | | main.rs:2026:18:2026:22 | SelfParam | | file://:0:0:0:0 | & | | main.rs:2026:18:2026:22 | SelfParam | &T | main.rs:2025:5:2027:5 | Self [trait MyTrait] | | main.rs:2030:18:2030:22 | SelfParam | | file://:0:0:0:0 | & | @@ -3798,7 +3942,6 @@ inferType | main.rs:2030:31:2032:9 | { ... } | | main.rs:2002:5:2002:14 | S2 | | main.rs:2031:13:2031:14 | S2 | | main.rs:2002:5:2002:14 | S2 | | main.rs:2036:18:2036:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2036:18:2036:22 | SelfParam | | main.rs:2003:5:2003:22 | S3 | | main.rs:2036:18:2036:22 | SelfParam | &T | main.rs:2003:5:2003:22 | S3 | | main.rs:2036:18:2036:22 | SelfParam | &T.T3 | main.rs:2035:10:2035:17 | T | | main.rs:2036:30:2039:9 | { ... } | | main.rs:2035:10:2035:17 | T | @@ -3807,106 +3950,105 @@ inferType | main.rs:2037:17:2037:21 | S3(...) | &T | main.rs:2003:5:2003:22 | S3 | | main.rs:2037:17:2037:21 | S3(...) | &T.T3 | main.rs:2035:10:2035:17 | T | | main.rs:2037:25:2037:28 | self | | file://:0:0:0:0 | & | -| main.rs:2037:25:2037:28 | self | | main.rs:2003:5:2003:22 | S3 | | main.rs:2037:25:2037:28 | self | &T | main.rs:2003:5:2003:22 | S3 | | main.rs:2037:25:2037:28 | self | &T.T3 | main.rs:2035:10:2035:17 | T | | main.rs:2038:13:2038:21 | t.clone() | | main.rs:2035:10:2035:17 | T | -| main.rs:2042:45:2044:5 | { ... } | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | +| main.rs:2042:45:2044:5 | { ... } | | main.rs:2042:28:2042:43 | impl ... | | main.rs:2043:9:2043:10 | S1 | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2043:9:2043:10 | S1 | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | +| main.rs:2043:9:2043:10 | S1 | | main.rs:2042:28:2042:43 | impl ... | | main.rs:2046:41:2046:41 | t | | main.rs:2046:26:2046:38 | B | | main.rs:2046:52:2048:5 | { ... } | | main.rs:2046:23:2046:23 | A | | main.rs:2047:9:2047:9 | t | | main.rs:2046:26:2046:38 | B | | main.rs:2047:9:2047:17 | t.get_a() | | main.rs:2046:23:2046:23 | A | | main.rs:2050:34:2050:34 | x | | main.rs:2050:24:2050:31 | T | -| main.rs:2050:59:2052:5 | { ... } | | main.rs:2050:43:2050:57 | ImplTraitTypeRepr | +| main.rs:2050:59:2052:5 | { ... } | | main.rs:2050:43:2050:57 | impl ... | | main.rs:2050:59:2052:5 | { ... } | impl(T) | main.rs:2050:24:2050:31 | T | | main.rs:2051:9:2051:13 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2051:9:2051:13 | S3(...) | | main.rs:2050:43:2050:57 | ImplTraitTypeRepr | +| main.rs:2051:9:2051:13 | S3(...) | | main.rs:2050:43:2050:57 | impl ... | | main.rs:2051:9:2051:13 | S3(...) | T3 | main.rs:2050:24:2050:31 | T | | main.rs:2051:9:2051:13 | S3(...) | impl(T) | main.rs:2050:24:2050:31 | T | | main.rs:2051:12:2051:12 | x | | main.rs:2050:24:2050:31 | T | | main.rs:2054:34:2054:34 | x | | main.rs:2054:24:2054:31 | T | | main.rs:2054:67:2056:5 | { ... } | | {EXTERNAL LOCATION} | Option | -| main.rs:2054:67:2056:5 | { ... } | T | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | +| main.rs:2054:67:2056:5 | { ... } | T | main.rs:2054:50:2054:64 | impl ... | | main.rs:2054:67:2056:5 | { ... } | T.impl(T) | main.rs:2054:24:2054:31 | T | | main.rs:2055:9:2055:19 | Some(...) | | {EXTERNAL LOCATION} | Option | | main.rs:2055:9:2055:19 | Some(...) | T | main.rs:2003:5:2003:22 | S3 | -| main.rs:2055:9:2055:19 | Some(...) | T | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | +| main.rs:2055:9:2055:19 | Some(...) | T | main.rs:2054:50:2054:64 | impl ... | | main.rs:2055:9:2055:19 | Some(...) | T.T3 | main.rs:2054:24:2054:31 | T | | main.rs:2055:9:2055:19 | Some(...) | T.impl(T) | main.rs:2054:24:2054:31 | T | | main.rs:2055:14:2055:18 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2055:14:2055:18 | S3(...) | | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | +| main.rs:2055:14:2055:18 | S3(...) | | main.rs:2054:50:2054:64 | impl ... | | main.rs:2055:14:2055:18 | S3(...) | T3 | main.rs:2054:24:2054:31 | T | | main.rs:2055:14:2055:18 | S3(...) | impl(T) | main.rs:2054:24:2054:31 | T | | main.rs:2055:17:2055:17 | x | | main.rs:2054:24:2054:31 | T | | main.rs:2058:34:2058:34 | x | | main.rs:2058:24:2058:31 | T | | main.rs:2058:78:2060:5 | { ... } | | file://:0:0:0:0 | (T_2) | -| main.rs:2058:78:2060:5 | { ... } | 0(2) | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | +| main.rs:2058:78:2060:5 | { ... } | 0(2) | main.rs:2058:44:2058:58 | impl ... | | main.rs:2058:78:2060:5 | { ... } | 0(2).impl(T) | main.rs:2058:24:2058:31 | T | -| main.rs:2058:78:2060:5 | { ... } | 1(2) | main.rs:2058:61:2058:75 | ImplTraitTypeRepr | +| main.rs:2058:78:2060:5 | { ... } | 1(2) | main.rs:2058:61:2058:75 | impl ... | | main.rs:2058:78:2060:5 | { ... } | 1(2).impl(T) | main.rs:2058:24:2058:31 | T | | main.rs:2059:9:2059:30 | TupleExpr | | file://:0:0:0:0 | (T_2) | | main.rs:2059:9:2059:30 | TupleExpr | 0(2) | main.rs:2003:5:2003:22 | S3 | -| main.rs:2059:9:2059:30 | TupleExpr | 0(2) | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | +| main.rs:2059:9:2059:30 | TupleExpr | 0(2) | main.rs:2058:44:2058:58 | impl ... | | main.rs:2059:9:2059:30 | TupleExpr | 0(2).T3 | main.rs:2058:24:2058:31 | T | | main.rs:2059:9:2059:30 | TupleExpr | 0(2).impl(T) | main.rs:2058:24:2058:31 | T | | main.rs:2059:9:2059:30 | TupleExpr | 1(2) | main.rs:2003:5:2003:22 | S3 | -| main.rs:2059:9:2059:30 | TupleExpr | 1(2) | main.rs:2058:61:2058:75 | ImplTraitTypeRepr | +| main.rs:2059:9:2059:30 | TupleExpr | 1(2) | main.rs:2058:61:2058:75 | impl ... | | main.rs:2059:9:2059:30 | TupleExpr | 1(2).T3 | main.rs:2058:24:2058:31 | T | | main.rs:2059:9:2059:30 | TupleExpr | 1(2).impl(T) | main.rs:2058:24:2058:31 | T | | main.rs:2059:10:2059:22 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2059:10:2059:22 | S3(...) | | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | +| main.rs:2059:10:2059:22 | S3(...) | | main.rs:2058:44:2058:58 | impl ... | | main.rs:2059:10:2059:22 | S3(...) | T3 | main.rs:2058:24:2058:31 | T | | main.rs:2059:10:2059:22 | S3(...) | impl(T) | main.rs:2058:24:2058:31 | T | | main.rs:2059:13:2059:13 | x | | main.rs:2058:24:2058:31 | T | | main.rs:2059:13:2059:21 | x.clone() | | main.rs:2058:24:2058:31 | T | | main.rs:2059:25:2059:29 | S3(...) | | main.rs:2003:5:2003:22 | S3 | -| main.rs:2059:25:2059:29 | S3(...) | | main.rs:2058:61:2058:75 | ImplTraitTypeRepr | +| main.rs:2059:25:2059:29 | S3(...) | | main.rs:2058:61:2058:75 | impl ... | | main.rs:2059:25:2059:29 | S3(...) | T3 | main.rs:2058:24:2058:31 | T | | main.rs:2059:25:2059:29 | S3(...) | impl(T) | main.rs:2058:24:2058:31 | T | | main.rs:2059:28:2059:28 | x | | main.rs:2058:24:2058:31 | T | -| main.rs:2062:26:2062:26 | t | | main.rs:2062:29:2062:43 | ImplTraitTypeRepr | +| main.rs:2062:26:2062:26 | t | | main.rs:2062:29:2062:43 | impl ... | | main.rs:2062:51:2064:5 | { ... } | | main.rs:2062:23:2062:23 | A | -| main.rs:2063:9:2063:9 | t | | main.rs:2062:29:2062:43 | ImplTraitTypeRepr | +| main.rs:2063:9:2063:9 | t | | main.rs:2062:29:2062:43 | impl ... | | main.rs:2063:9:2063:17 | t.get_a() | | main.rs:2062:23:2062:23 | A | -| main.rs:2067:13:2067:13 | x | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2067:17:2067:20 | f1(...) | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2068:9:2068:9 | x | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2069:9:2069:9 | x | | main.rs:2021:16:2021:35 | ImplTraitTypeRepr | -| main.rs:2070:13:2070:13 | a | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2070:17:2070:32 | get_a_my_trait(...) | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | +| main.rs:2067:13:2067:13 | x | | main.rs:2021:16:2021:35 | impl ... + ... | +| main.rs:2067:17:2067:20 | f1(...) | | main.rs:2021:16:2021:35 | impl ... + ... | +| main.rs:2068:9:2068:9 | x | | main.rs:2021:16:2021:35 | impl ... + ... | +| main.rs:2069:9:2069:9 | x | | main.rs:2021:16:2021:35 | impl ... + ... | +| main.rs:2070:13:2070:13 | a | | main.rs:2042:28:2042:43 | impl ... | +| main.rs:2070:17:2070:32 | get_a_my_trait(...) | | main.rs:2042:28:2042:43 | impl ... | | main.rs:2071:13:2071:13 | b | | main.rs:2002:5:2002:14 | S2 | | main.rs:2071:17:2071:33 | uses_my_trait1(...) | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2071:32:2071:32 | a | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2072:13:2072:13 | a | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | -| main.rs:2072:17:2072:32 | get_a_my_trait(...) | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | +| main.rs:2071:32:2071:32 | a | | main.rs:2042:28:2042:43 | impl ... | +| main.rs:2072:13:2072:13 | a | | main.rs:2042:28:2042:43 | impl ... | +| main.rs:2072:17:2072:32 | get_a_my_trait(...) | | main.rs:2042:28:2042:43 | impl ... | | main.rs:2073:13:2073:13 | c | | main.rs:2002:5:2002:14 | S2 | | main.rs:2073:17:2073:33 | uses_my_trait2(...) | | main.rs:2002:5:2002:14 | S2 | -| main.rs:2073:32:2073:32 | a | | main.rs:2042:28:2042:43 | ImplTraitTypeRepr | +| main.rs:2073:32:2073:32 | a | | main.rs:2042:28:2042:43 | impl ... | | main.rs:2074:13:2074:13 | d | | main.rs:2002:5:2002:14 | S2 | | main.rs:2074:17:2074:34 | uses_my_trait2(...) | | main.rs:2002:5:2002:14 | S2 | | main.rs:2074:32:2074:33 | S1 | | main.rs:2000:5:2001:14 | S1 | | main.rs:2075:13:2075:13 | e | | main.rs:2000:5:2001:14 | S1 | -| main.rs:2075:17:2075:35 | get_a_my_trait2(...) | | main.rs:2050:43:2050:57 | ImplTraitTypeRepr | +| main.rs:2075:17:2075:35 | get_a_my_trait2(...) | | main.rs:2050:43:2050:57 | impl ... | | main.rs:2075:17:2075:35 | get_a_my_trait2(...) | impl(T) | main.rs:2000:5:2001:14 | S1 | | main.rs:2075:17:2075:43 | ... .get_a() | | main.rs:2000:5:2001:14 | S1 | | main.rs:2075:33:2075:34 | S1 | | main.rs:2000:5:2001:14 | S1 | | main.rs:2078:13:2078:13 | f | | main.rs:2000:5:2001:14 | S1 | | main.rs:2078:17:2078:35 | get_a_my_trait3(...) | | {EXTERNAL LOCATION} | Option | -| main.rs:2078:17:2078:35 | get_a_my_trait3(...) | T | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | +| main.rs:2078:17:2078:35 | get_a_my_trait3(...) | T | main.rs:2054:50:2054:64 | impl ... | | main.rs:2078:17:2078:35 | get_a_my_trait3(...) | T.impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2078:17:2078:44 | ... .unwrap() | | main.rs:2054:50:2054:64 | ImplTraitTypeRepr | +| main.rs:2078:17:2078:44 | ... .unwrap() | | main.rs:2054:50:2054:64 | impl ... | | main.rs:2078:17:2078:44 | ... .unwrap() | impl(T) | main.rs:2000:5:2001:14 | S1 | | main.rs:2078:17:2078:52 | ... .get_a() | | main.rs:2000:5:2001:14 | S1 | | main.rs:2078:33:2078:34 | S1 | | main.rs:2000:5:2001:14 | S1 | | main.rs:2079:13:2079:13 | g | | main.rs:2000:5:2001:14 | S1 | | main.rs:2079:17:2079:35 | get_a_my_trait4(...) | | file://:0:0:0:0 | (T_2) | -| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 0(2) | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | +| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 0(2) | main.rs:2058:44:2058:58 | impl ... | | main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 0(2).impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 1(2) | main.rs:2058:61:2058:75 | ImplTraitTypeRepr | +| main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 1(2) | main.rs:2058:61:2058:75 | impl ... | | main.rs:2079:17:2079:35 | get_a_my_trait4(...) | 1(2).impl(T) | main.rs:2000:5:2001:14 | S1 | -| main.rs:2079:17:2079:37 | ... .0 | | main.rs:2058:44:2058:58 | ImplTraitTypeRepr | +| main.rs:2079:17:2079:37 | ... .0 | | main.rs:2058:44:2058:58 | impl ... | | main.rs:2079:17:2079:37 | ... .0 | impl(T) | main.rs:2000:5:2001:14 | S1 | | main.rs:2079:17:2079:45 | ... .get_a() | | main.rs:2000:5:2001:14 | S1 | | main.rs:2079:33:2079:34 | S1 | | main.rs:2000:5:2001:14 | S1 | @@ -4936,89 +5078,49 @@ inferType | main.rs:2566:26:2566:43 | "Nested boxed: {}\\n" | &T | {EXTERNAL LOCATION} | str | | main.rs:2566:26:2566:59 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | | main.rs:2566:26:2566:59 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2578:21:2578:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2578:21:2578:25 | SelfParam | &T | main.rs:2577:5:2580:5 | Self [trait Executor] | -| main.rs:2579:24:2579:28 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2579:24:2579:28 | SelfParam | &T | main.rs:2577:5:2580:5 | Self [trait Executor] | -| main.rs:2579:31:2579:35 | query | | main.rs:2579:21:2579:21 | E | -| main.rs:2583:21:2583:25 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2583:21:2583:25 | SelfParam | &T | main.rs:2582:10:2582:22 | T | -| main.rs:2584:22:2584:41 | "Executor::execute1\\n" | | file://:0:0:0:0 | & | -| main.rs:2584:22:2584:41 | "Executor::execute1\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2584:22:2584:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2584:22:2584:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2587:24:2587:28 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2587:24:2587:28 | SelfParam | &T | main.rs:2582:10:2582:22 | T | -| main.rs:2587:31:2587:36 | _query | | main.rs:2587:21:2587:21 | E | -| main.rs:2588:22:2588:41 | "Executor::execute2\\n" | | file://:0:0:0:0 | & | -| main.rs:2588:22:2588:41 | "Executor::execute2\\n" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2588:22:2588:41 | FormatArgsExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2588:22:2588:41 | MacroExpr | | {EXTERNAL LOCATION} | Arguments | -| main.rs:2597:13:2597:13 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2597:17:2597:34 | MySqlConnection {...} | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2599:9:2599:9 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2600:35:2600:36 | &c | | file://:0:0:0:0 | & | -| main.rs:2600:35:2600:36 | &c | &T | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2600:36:2600:36 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2602:9:2602:9 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2602:20:2602:40 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| main.rs:2602:20:2602:40 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2603:9:2603:9 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2603:28:2603:48 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| main.rs:2603:28:2603:48 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2604:35:2604:36 | &c | | file://:0:0:0:0 | & | -| main.rs:2604:35:2604:36 | &c | &T | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2604:36:2604:36 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2604:39:2604:59 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| main.rs:2604:39:2604:59 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2605:43:2605:44 | &c | | file://:0:0:0:0 | & | -| main.rs:2605:43:2605:44 | &c | &T | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2605:44:2605:44 | c | | main.rs:2592:5:2592:29 | MySqlConnection | -| main.rs:2605:47:2605:67 | "SELECT * FROM users" | | file://:0:0:0:0 | & | -| main.rs:2605:47:2605:67 | "SELECT * FROM users" | &T | {EXTERNAL LOCATION} | str | -| main.rs:2615:36:2617:9 | { ... } | | main.rs:2612:5:2612:22 | Path | -| main.rs:2616:13:2616:19 | Path {...} | | main.rs:2612:5:2612:22 | Path | -| main.rs:2619:29:2619:33 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2619:29:2619:33 | SelfParam | &T | main.rs:2612:5:2612:22 | Path | -| main.rs:2619:59:2621:9 | { ... } | | {EXTERNAL LOCATION} | Result | -| main.rs:2619:59:2621:9 | { ... } | E | file://:0:0:0:0 | () | -| main.rs:2619:59:2621:9 | { ... } | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2620:13:2620:30 | Ok(...) | | {EXTERNAL LOCATION} | Result | -| main.rs:2620:13:2620:30 | Ok(...) | E | file://:0:0:0:0 | () | -| main.rs:2620:13:2620:30 | Ok(...) | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2620:16:2620:29 | ...::new(...) | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2627:39:2629:9 | { ... } | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2628:13:2628:22 | PathBuf {...} | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2637:18:2637:22 | SelfParam | | file://:0:0:0:0 | & | -| main.rs:2637:18:2637:22 | SelfParam | &T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2637:34:2641:9 | { ... } | | file://:0:0:0:0 | & | -| main.rs:2637:34:2641:9 | { ... } | &T | main.rs:2612:5:2612:22 | Path | -| main.rs:2639:33:2639:43 | ...::new(...) | | main.rs:2612:5:2612:22 | Path | -| main.rs:2640:13:2640:17 | &path | | file://:0:0:0:0 | & | -| main.rs:2640:13:2640:17 | &path | &T | main.rs:2612:5:2612:22 | Path | -| main.rs:2640:14:2640:17 | path | | main.rs:2612:5:2612:22 | Path | -| main.rs:2645:13:2645:17 | path1 | | main.rs:2612:5:2612:22 | Path | -| main.rs:2645:21:2645:31 | ...::new(...) | | main.rs:2612:5:2612:22 | Path | -| main.rs:2646:13:2646:17 | path2 | | {EXTERNAL LOCATION} | Result | -| main.rs:2646:13:2646:17 | path2 | E | file://:0:0:0:0 | () | -| main.rs:2646:13:2646:17 | path2 | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2646:21:2646:25 | path1 | | main.rs:2612:5:2612:22 | Path | -| main.rs:2646:21:2646:40 | path1.canonicalize() | | {EXTERNAL LOCATION} | Result | -| main.rs:2646:21:2646:40 | path1.canonicalize() | E | file://:0:0:0:0 | () | -| main.rs:2646:21:2646:40 | path1.canonicalize() | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2647:13:2647:17 | path3 | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2647:21:2647:25 | path2 | | {EXTERNAL LOCATION} | Result | -| main.rs:2647:21:2647:25 | path2 | E | file://:0:0:0:0 | () | -| main.rs:2647:21:2647:25 | path2 | T | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2647:21:2647:34 | path2.unwrap() | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2649:13:2649:20 | pathbuf1 | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2649:24:2649:37 | ...::new(...) | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2650:24:2650:31 | pathbuf1 | | main.rs:2624:5:2624:25 | PathBuf | -| main.rs:2661:5:2661:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2662:5:2662:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | -| main.rs:2662:20:2662:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2662:41:2662:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | -| main.rs:2678:5:2678:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future | +| main.rs:2578:36:2580:9 | { ... } | | main.rs:2575:5:2575:22 | Path | +| main.rs:2579:13:2579:19 | Path {...} | | main.rs:2575:5:2575:22 | Path | +| main.rs:2582:29:2582:33 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2582:29:2582:33 | SelfParam | &T | main.rs:2575:5:2575:22 | Path | +| main.rs:2582:59:2584:9 | { ... } | | {EXTERNAL LOCATION} | Result | +| main.rs:2582:59:2584:9 | { ... } | E | file://:0:0:0:0 | () | +| main.rs:2582:59:2584:9 | { ... } | T | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2583:13:2583:30 | Ok(...) | | {EXTERNAL LOCATION} | Result | +| main.rs:2583:13:2583:30 | Ok(...) | E | file://:0:0:0:0 | () | +| main.rs:2583:13:2583:30 | Ok(...) | T | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2583:16:2583:29 | ...::new(...) | | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2590:39:2592:9 | { ... } | | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2591:13:2591:22 | PathBuf {...} | | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2600:18:2600:22 | SelfParam | | file://:0:0:0:0 | & | +| main.rs:2600:18:2600:22 | SelfParam | &T | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2600:34:2604:9 | { ... } | | file://:0:0:0:0 | & | +| main.rs:2600:34:2604:9 | { ... } | &T | main.rs:2575:5:2575:22 | Path | +| main.rs:2602:33:2602:43 | ...::new(...) | | main.rs:2575:5:2575:22 | Path | +| main.rs:2603:13:2603:17 | &path | | file://:0:0:0:0 | & | +| main.rs:2603:13:2603:17 | &path | &T | main.rs:2575:5:2575:22 | Path | +| main.rs:2603:14:2603:17 | path | | main.rs:2575:5:2575:22 | Path | +| main.rs:2608:13:2608:17 | path1 | | main.rs:2575:5:2575:22 | Path | +| main.rs:2608:21:2608:31 | ...::new(...) | | main.rs:2575:5:2575:22 | Path | +| main.rs:2609:13:2609:17 | path2 | | {EXTERNAL LOCATION} | Result | +| main.rs:2609:13:2609:17 | path2 | E | file://:0:0:0:0 | () | +| main.rs:2609:13:2609:17 | path2 | T | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2609:21:2609:25 | path1 | | main.rs:2575:5:2575:22 | Path | +| main.rs:2609:21:2609:40 | path1.canonicalize() | | {EXTERNAL LOCATION} | Result | +| main.rs:2609:21:2609:40 | path1.canonicalize() | E | file://:0:0:0:0 | () | +| main.rs:2609:21:2609:40 | path1.canonicalize() | T | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2610:13:2610:17 | path3 | | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2610:21:2610:25 | path2 | | {EXTERNAL LOCATION} | Result | +| main.rs:2610:21:2610:25 | path2 | E | file://:0:0:0:0 | () | +| main.rs:2610:21:2610:25 | path2 | T | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2610:21:2610:34 | path2.unwrap() | | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2612:13:2612:20 | pathbuf1 | | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2612:24:2612:37 | ...::new(...) | | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2613:24:2613:31 | pathbuf1 | | main.rs:2587:5:2587:25 | PathBuf | +| main.rs:2625:5:2625:20 | ...::f(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2626:5:2626:60 | ...::g(...) | | main.rs:72:5:72:21 | Foo | +| main.rs:2626:20:2626:38 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2626:41:2626:59 | ...::Foo {...} | | main.rs:72:5:72:21 | Foo | +| main.rs:2642:5:2642:15 | ...::f(...) | | {EXTERNAL LOCATION} | trait Future | | pattern_matching.rs:13:26:133:1 | { ... } | | {EXTERNAL LOCATION} | Option | | pattern_matching.rs:13:26:133:1 | { ... } | T | file://:0:0:0:0 | () | | pattern_matching.rs:14:9:14:13 | value | | {EXTERNAL LOCATION} | Option | diff --git a/rust/ql/test/library-tests/type-inference/type-inference.ql b/rust/ql/test/library-tests/type-inference/type-inference.ql index 2122c7898a7d..059cc7848a0a 100644 --- a/rust/ql/test/library-tests/type-inference/type-inference.ql +++ b/rust/ql/test/library-tests/type-inference/type-inference.ql @@ -48,24 +48,27 @@ module ResolveTest implements TestSig { } module TypeTest implements TestSig { - string getARelevantTag() { result = "type" } + string getARelevantTag() { result = ["type", "certainType"] } predicate tagIsOptional(string expectedTag) { expectedTag = "type" } predicate hasActualResult(Location location, string element, string tag, string value) { none() } predicate hasOptionalResult(Location location, string element, string tag, string value) { - tag = "type" and exists(AstNode n, TypePath path, Type t | t = TypeInference::inferType(n, path) and + ( + if t = TypeInference::CertainTypeInference::inferCertainType(n, path) + then tag = "certainType" + else tag = "type" + ) and location = n.getLocation() and - if path.isEmpty() - then value = element + ":" + t - else value = element + ":" + path.toString() + "." + t.toString() - | - element = n.toString() - or - element = n.(IdentPat).getName().getText() + ( + if path.isEmpty() + then value = element + ":" + t + else value = element + ":" + path.toString() + "." + t.toString() + ) and + element = [n.toString(), n.(IdentPat).getName().getText()] ) } } diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected index 25f92e390de8..8e2a7d13ddad 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected @@ -18,30 +18,31 @@ edges | src/main.rs:7:11:7:19 | file_name | src/main.rs:9:35:9:43 | file_name | provenance | | | src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | | | src/main.rs:9:21:9:44 | ...::from(...) | src/main.rs:9:9:9:17 | file_path | provenance | | -| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:13 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:9 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:14 | | src/main.rs:11:24:11:32 | file_path | src/main.rs:11:5:11:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:50:51:50:59 | file_path | src/main.rs:52:32:52:40 | file_path | provenance | | | src/main.rs:52:9:52:17 | file_path [&ref] | src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | provenance | Config | | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | src/main.rs:52:9:52:17 | file_path [&ref] | provenance | | -| src/main.rs:52:31:52:40 | &file_path [&ref] | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | provenance | MaD:12 | +| src/main.rs:52:31:52:40 | &file_path [&ref] | src/main.rs:52:21:52:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:52:32:52:40 | file_path | src/main.rs:52:31:52:40 | &file_path [&ref] | provenance | | | src/main.rs:53:9:53:17 | file_path | src/main.rs:58:24:58:32 | file_path | provenance | | -| src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | src/main.rs:53:21:53:53 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:53:21:53:44 | file_path.canonicalize() [Ok] | src/main.rs:53:21:53:53 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:53:21:53:53 | ... .unwrap() | src/main.rs:53:9:53:17 | file_path | provenance | | | src/main.rs:58:24:58:32 | file_path | src/main.rs:58:5:58:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:63:11:63:19 | file_path | src/main.rs:66:32:66:40 | file_path | provenance | | | src/main.rs:66:9:66:17 | file_path [&ref] | src/main.rs:71:24:71:32 | file_path [&ref] | provenance | | | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | src/main.rs:66:9:66:17 | file_path [&ref] | provenance | | -| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:12 | +| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:66:32:66:40 | file_path | src/main.rs:66:31:66:40 | &file_path [&ref] | provenance | | | src/main.rs:71:24:71:32 | file_path [&ref] | src/main.rs:71:5:71:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:90:11:90:19 | file_path | src/main.rs:93:32:93:40 | file_path | provenance | | | src/main.rs:93:9:93:17 | file_path [&ref] | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | provenance | Config | | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | src/main.rs:93:9:93:17 | file_path [&ref] | provenance | | -| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:12 | +| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:93:32:93:40 | file_path | src/main.rs:93:31:93:40 | &file_path [&ref] | provenance | | | src/main.rs:98:9:98:17 | file_path | src/main.rs:99:24:99:32 | file_path | provenance | | -| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:98:21:98:53 | ... .unwrap() | src/main.rs:98:9:98:17 | file_path | provenance | | | src/main.rs:99:24:99:32 | file_path | src/main.rs:99:5:99:22 | ...::read_to_string | provenance | MaD:6 Sink:MaD:6 | | src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:37 | path1 | provenance | | @@ -58,39 +59,39 @@ edges | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:41 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:8 | | src/main.rs:103:17:103:30 | ...::args | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:9 | -| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:10 | +| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:10 | +| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:103:17:103:48 | ... .unwrap() | src/main.rs:103:9:103:13 | path1 | provenance | | | src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:8 | | src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:104:13:104:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:106:9:106:13 | path2 | src/main.rs:107:33:107:37 | path2 | provenance | | -| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:106:17:106:61 | ... .unwrap() | src/main.rs:106:9:106:13 | path2 | provenance | | | src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:8 | | src/main.rs:106:39:106:51 | path1.clone() | src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | provenance | Config | | src/main.rs:107:33:107:37 | path2 | src/main.rs:107:13:107:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:109:9:109:13 | path3 | src/main.rs:110:35:110:39 | path3 | provenance | | | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | src/main.rs:109:17:109:60 | await ... [Ok] | provenance | | -| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:109:17:109:69 | ... .unwrap() | src/main.rs:109:9:109:13 | path3 | provenance | | | src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:8 | | src/main.rs:109:41:109:53 | path1.clone() | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:110:35:110:39 | path3 | src/main.rs:110:13:110:33 | ...::open | provenance | MaD:4 Sink:MaD:4 | | src/main.rs:112:9:112:13 | path4 | src/main.rs:113:39:113:43 | path4 | provenance | | | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | src/main.rs:112:17:112:64 | await ... [Ok] | provenance | | -| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:112:17:112:73 | ... .unwrap() | src/main.rs:112:9:112:13 | path4 | provenance | | | src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:8 | | src/main.rs:112:45:112:57 | path1.clone() | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:113:39:113:43 | path4 | src/main.rs:113:13:113:37 | ...::open | provenance | MaD:1 Sink:MaD:1 | | src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:116:33:116:37 | path5 [&ref] | provenance | | | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | src/main.rs:115:9:115:13 | path5 [&ref] | provenance | | -| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:12 | +| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:115:39:115:43 | path1 | src/main.rs:115:38:115:43 | &path1 [&ref] | provenance | | | src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:116:13:116:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:116:33:116:37 | path5 [&ref] | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | provenance | Config | | src/main.rs:118:9:118:13 | path6 | src/main.rs:119:33:119:37 | path6 | provenance | | -| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:11 | +| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:12 | | src/main.rs:118:17:118:45 | ... .unwrap() | src/main.rs:118:9:118:13 | path6 | provenance | | | src/main.rs:119:33:119:37 | path6 | src/main.rs:119:13:119:31 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:8 | @@ -101,15 +102,15 @@ edges | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:174:36:174:43 | path_str [&ref] | provenance | | | src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:173:8:173:11 | path [&ref] | provenance | | | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | src/main.rs:172:9:172:12 | path [&ref] | provenance | | -| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:12 | +| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:173:8:173:11 | path [&ref] | src/main.rs:173:13:173:18 | exists | provenance | MaD:3 Sink:MaD:3 | | src/main.rs:173:8:173:11 | path [&ref] | src/main.rs:177:36:177:39 | path [&ref] | provenance | | | src/main.rs:174:36:174:43 | path_str [&ref] | src/main.rs:174:25:174:34 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:177:36:177:39 | path [&ref] | src/main.rs:177:25:177:34 | ...::open | provenance | MaD:2 Sink:MaD:2 | | src/main.rs:185:9:185:13 | path1 | src/main.rs:186:18:186:22 | path1 | provenance | | | src/main.rs:185:17:185:30 | ...::args | src/main.rs:185:17:185:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:9 | -| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:10 | +| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:10 | +| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:185:17:185:48 | ... .unwrap() | src/main.rs:185:9:185:13 | path1 | provenance | | | src/main.rs:186:17:186:22 | &path1 [&ref] | src/main.rs:170:16:170:29 | ...: ... [&ref] | provenance | | | src/main.rs:186:18:186:22 | path1 | src/main.rs:186:17:186:22 | &path1 [&ref] | provenance | | @@ -122,11 +123,12 @@ models | 6 | Sink: std::fs::read_to_string; Argument[0]; path-injection | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | | 8 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 9 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 10 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 12 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | -| 13 | Summary: ::from; Argument[0]; ReturnValue; value | +| 9 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; value | +| 10 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | +| 14 | Summary: ::from; Argument[0]; ReturnValue; taint | nodes | src/main.rs:7:11:7:19 | file_name | semmle.label | file_name | | src/main.rs:9:9:9:17 | file_path | semmle.label | file_path | diff --git a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected index b5d4fea346d2..d195a145aafc 100644 --- a/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/query-tests/security/CWE-089/CONSISTENCY/PathResolutionConsistency.expected @@ -12,12 +12,14 @@ multipleCallTargets | sqlx.rs:67:26:67:48 | unsafe_query_1.as_str() | | sqlx.rs:69:30:69:52 | unsafe_query_2.as_str() | | sqlx.rs:70:30:70:52 | unsafe_query_3.as_str() | +| sqlx.rs:71:30:71:52 | unsafe_query_4.as_str() | | sqlx.rs:75:25:75:45 | safe_query_1.as_str() | | sqlx.rs:76:25:76:45 | safe_query_2.as_str() | | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() | | sqlx.rs:81:29:81:51 | unsafe_query_3.as_str() | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | | sqlx.rs:84:25:84:49 | prepared_query_1.as_str() | | sqlx.rs:85:25:85:49 | prepared_query_1.as_str() | | sqlx.rs:87:29:87:53 | prepared_query_1.as_str() | diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index 2168ca56a444..329138efa245 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -2,6 +2,7 @@ | sqlx.rs:77:13:77:23 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:77:13:77:23 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | | sqlx.rs:78:13:78:23 | ...::query | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:78:13:78:23 | ...::query | This query depends on a $@. | sqlx.rs:47:22:47:35 | ...::args | user-provided value | | sqlx.rs:80:17:80:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:80:17:80:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | +| sqlx.rs:82:17:82:27 | ...::query | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:82:17:82:27 | ...::query | This query depends on a $@. | sqlx.rs:48:25:48:46 | ...::get | user-provided value | edges | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | | sqlx.rs:47:22:47:35 | ...::args | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:3 | @@ -11,6 +12,7 @@ edges | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:10 | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:49:25:49:52 | remote_string.parse() [Ok] | provenance | MaD:10 | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | +| sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:59:17:59:72 | MacroExpr | provenance | | | sqlx.rs:48:25:48:46 | ...::get | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:2 | | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:7 | | sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:11 | @@ -38,6 +40,15 @@ edges | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:54:26:54:39 | &remote_string [&ref] | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | provenance | | | sqlx.rs:54:27:54:39 | remote_string | sqlx.rs:54:26:54:39 | &remote_string [&ref] | provenance | | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:42 | unsafe_query_4 | provenance | | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:9 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:5 | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | MaD:9 | +| sqlx.rs:59:9:59:15 | res | sqlx.rs:59:17:59:72 | { ... } | provenance | | +| sqlx.rs:59:17:59:72 | ...::format(...) | sqlx.rs:59:9:59:15 | res | provenance | | +| sqlx.rs:59:17:59:72 | ...::must_use(...) | sqlx.rs:56:9:56:22 | unsafe_query_4 | provenance | | +| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:12 | +| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:13 | | sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:9 | | sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:5 | | sqlx.rs:77:25:77:36 | safe_query_3 | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | provenance | MaD:9 | @@ -45,6 +56,11 @@ edges | sqlx.rs:77:25:77:45 | safe_query_3.as_str() [&ref] | sqlx.rs:77:13:77:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:13:78:23 | ...::query | provenance | MaD:1 Sink:MaD:1 | | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | sqlx.rs:80:17:80:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:9 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:5 | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | provenance | MaD:9 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:17:82:27 | ...::query | provenance | MaD:1 Sink:MaD:1 | models | 1 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | | 2 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | @@ -86,6 +102,12 @@ nodes | sqlx.rs:54:9:54:22 | unsafe_query_2 [&ref] | semmle.label | unsafe_query_2 [&ref] | | sqlx.rs:54:26:54:39 | &remote_string [&ref] | semmle.label | &remote_string [&ref] | | sqlx.rs:54:27:54:39 | remote_string | semmle.label | remote_string | +| sqlx.rs:56:9:56:22 | unsafe_query_4 | semmle.label | unsafe_query_4 | +| sqlx.rs:59:9:59:15 | res | semmle.label | res | +| sqlx.rs:59:17:59:72 | ...::format(...) | semmle.label | ...::format(...) | +| sqlx.rs:59:17:59:72 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| sqlx.rs:59:17:59:72 | MacroExpr | semmle.label | MacroExpr | +| sqlx.rs:59:17:59:72 | { ... } | semmle.label | { ... } | | sqlx.rs:77:13:77:23 | ...::query | semmle.label | ...::query | | sqlx.rs:77:25:77:36 | safe_query_3 | semmle.label | safe_query_3 | | sqlx.rs:77:25:77:45 | safe_query_3.as_str() | semmle.label | safe_query_3.as_str() | @@ -94,4 +116,8 @@ nodes | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | semmle.label | unsafe_query_1.as_str() [&ref] | | sqlx.rs:80:17:80:27 | ...::query | semmle.label | ...::query | | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | semmle.label | unsafe_query_2.as_str() [&ref] | +| sqlx.rs:82:17:82:27 | ...::query | semmle.label | ...::query | +| sqlx.rs:82:29:82:42 | unsafe_query_4 | semmle.label | unsafe_query_4 | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | semmle.label | unsafe_query_4.as_str() | +| sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | semmle.label | unsafe_query_4.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-089/sqlx.rs b/rust/ql/test/query-tests/security/CWE-089/sqlx.rs index 8e1afa9f0e8f..7f244c4b4cbb 100644 --- a/rust/ql/test/query-tests/security/CWE-089/sqlx.rs +++ b/rust/ql/test/query-tests/security/CWE-089/sqlx.rs @@ -79,7 +79,7 @@ async fn test_sqlx_mysql(url: &str, enable_remote: bool) -> Result<(), sqlx::Err if enable_remote { let _ = sqlx::query(unsafe_query_2.as_str()).execute(&pool).await?; // $ sql-sink Alert[rust/sql-injection]=remote1 let _ = sqlx::query(unsafe_query_3.as_str()).execute(&pool).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote1 - let _ = sqlx::query(unsafe_query_4.as_str()).execute(&pool).await?; // $ sql-sink MISSING: Alert[rust/sql-injection]=remote1 + let _ = sqlx::query(unsafe_query_4.as_str()).execute(&pool).await?; // $ sql-sink Alert[rust/sql-injection]=remote1 } let _ = sqlx::query(prepared_query_1.as_str()).bind(const_string).execute(&pool).await?; // $ sql-sink let _ = sqlx::query(prepared_query_1.as_str()).bind(arg_string).execute(&pool).await?; // $ sql-sink diff --git a/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected b/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected index dbeebc63e555..5b0ebe3fa625 100644 --- a/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected +++ b/rust/ql/test/query-tests/security/CWE-311/CleartextTransmission.expected @@ -51,10 +51,10 @@ edges | main.rs:33:50:33:57 | password | main.rs:33:23:33:57 | MacroExpr | provenance | | | main.rs:35:33:35:35 | url | main.rs:35:12:35:18 | request | provenance | MaD:2 Sink:MaD:2 | models -| 1 | Sink: ::post; Argument[0]; transmission | -| 2 | Sink: ::request; Argument[1]; transmission | -| 3 | Sink: ::request; Argument[1]; transmission | -| 4 | Sink: reqwest::blocking::get; Argument[0]; transmission | +| 1 | Sink: ::post; Argument[0]; request-url | +| 2 | Sink: ::request; Argument[1]; request-url | +| 3 | Sink: ::request; Argument[1]; request-url | +| 4 | Sink: reqwest::blocking::get; Argument[0]; request-url | | 5 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 6 | Summary: ::parse; Argument[0].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | | 7 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 2155fef0d407..d16be723b8f2 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -12,60 +12,87 @@ | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:51:31:51:48 | ...::new | This hard-coded value is used as $@. | test_cipher.rs:51:31:51:48 | ...::new | a key | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:74:23:74:44 | ...::new_from_slice | This hard-coded value is used as $@. | test_cipher.rs:74:23:74:44 | ...::new_from_slice | a key | +| test_cookie.rs:17:29:17:29 | 0 | test_cookie.rs:17:29:17:29 | 0 | test_cookie.rs:18:16:18:24 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:18:16:18:24 | ...::from | a key | +| test_cookie.rs:21:29:21:29 | 0 | test_cookie.rs:21:29:21:29 | 0 | test_cookie.rs:22:16:22:24 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:22:16:22:24 | ...::from | a key | +| test_cookie.rs:38:29:38:31 | 0u8 | test_cookie.rs:38:29:38:31 | 0u8 | test_cookie.rs:42:14:42:32 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:42:14:42:32 | ...::from | a key | +| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:53:14:53:32 | ...::from | This hard-coded value is used as $@. | test_cookie.rs:53:14:53:32 | ...::from | a key | edges | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | test_cipher.rs:19:73:19:78 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | test_cipher.rs:18:28:18:36 | &... [&ref, element] | provenance | | | test_cipher.rs:18:30:18:32 | 0u8 | test_cipher.rs:18:29:18:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | -| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | -| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | +| test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | test_cipher.rs:19:30:19:47 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:19:73:19:78 | const1 [&ref, element] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref, element] | provenance | MaD:10 | | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | test_cipher.rs:26:66:26:71 | const4 [&ref, element] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref, element] | test_cipher.rs:25:9:25:14 | const4 [&ref, element] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | test_cipher.rs:25:28:25:36 | &... [&ref, element] | provenance | | | test_cipher.rs:25:30:25:32 | 0u8 | test_cipher.rs:25:29:25:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | -| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | -| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | +| test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | test_cipher.rs:26:30:26:40 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:26:66:26:71 | const4 [&ref, element] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref, element] | provenance | MaD:10 | | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | test_cipher.rs:30:95:30:100 | const5 [&ref, element] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref, element] | test_cipher.rs:29:9:29:14 | const5 [&ref, element] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | test_cipher.rs:29:28:29:36 | &... [&ref, element] | provenance | | | test_cipher.rs:29:30:29:32 | 0u8 | test_cipher.rs:29:29:29:36 | [0u8; 16] [element] | provenance | | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | -| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | -| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | +| test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | test_cipher.rs:30:30:30:40 | ...::new | provenance | MaD:6 Sink:MaD:6 Sink:MaD:6 | +| test_cipher.rs:30:95:30:100 | const5 [&ref, element] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref, element] | provenance | MaD:10 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:2 Sink:MaD:2 | -| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:4 Sink:MaD:4 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:7 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:30:38:47 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:10 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:2 Sink:MaD:2 | -| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:4 Sink:MaD:4 | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:7 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:30:42:47 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:10 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | -| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:6 | +| test_cipher.rs:50:37:50:52 | ...::zeroed | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | provenance | Src:MaD:8 | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) [element] | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | -| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:4 Sink:MaD:4 Sink:MaD:4 | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:7 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:3 Sink:MaD:3 Sink:MaD:3 | +| test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:31:51:48 | ...::new | provenance | MaD:5 Sink:MaD:5 Sink:MaD:5 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:10 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:18:73:26 | &... [&ref, element] | test_cipher.rs:73:9:73:14 | const2 [&ref, element] | provenance | | | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | test_cipher.rs:73:18:73:26 | &... [&ref, element] | provenance | | | test_cipher.rs:73:20:73:22 | 0u8 | test_cipher.rs:73:19:73:26 | [0u8; 32] [element] | provenance | | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | test_cipher.rs:74:23:74:44 | ...::new_from_slice | provenance | MaD:1 Sink:MaD:1 Sink:MaD:1 | +| test_cookie.rs:17:9:17:14 | array1 [element] | test_cookie.rs:18:27:18:32 | array1 [element] | provenance | | +| test_cookie.rs:17:28:17:34 | [0; 64] [element] | test_cookie.rs:17:9:17:14 | array1 [element] | provenance | | +| test_cookie.rs:17:29:17:29 | 0 | test_cookie.rs:17:28:17:34 | [0; 64] [element] | provenance | | +| test_cookie.rs:18:26:18:32 | &array1 [&ref, element] | test_cookie.rs:18:16:18:24 | ...::from | provenance | MaD:7 Sink:MaD:7 | +| test_cookie.rs:18:27:18:32 | array1 [element] | test_cookie.rs:18:26:18:32 | &array1 [&ref, element] | provenance | | +| test_cookie.rs:21:9:21:14 | array2 [element] | test_cookie.rs:22:27:22:32 | array2 [element] | provenance | | +| test_cookie.rs:21:28:21:34 | [0; 64] [element] | test_cookie.rs:21:9:21:14 | array2 [element] | provenance | | +| test_cookie.rs:21:29:21:29 | 0 | test_cookie.rs:21:28:21:34 | [0; 64] [element] | provenance | | +| test_cookie.rs:22:26:22:32 | &array2 [&ref, element] | test_cookie.rs:22:16:22:24 | ...::from | provenance | MaD:7 Sink:MaD:7 | +| test_cookie.rs:22:27:22:32 | array2 [element] | test_cookie.rs:22:26:22:32 | &array2 [&ref, element] | provenance | | +| test_cookie.rs:38:9:38:14 | array2 [element] | test_cookie.rs:42:34:42:39 | array2 [element] | provenance | | +| test_cookie.rs:38:18:38:37 | ...::from(...) [element] | test_cookie.rs:38:9:38:14 | array2 [element] | provenance | | +| test_cookie.rs:38:28:38:36 | [0u8; 64] [element] | test_cookie.rs:38:18:38:37 | ...::from(...) [element] | provenance | MaD:9 | +| test_cookie.rs:38:29:38:31 | 0u8 | test_cookie.rs:38:28:38:36 | [0u8; 64] [element] | provenance | | +| test_cookie.rs:42:34:42:39 | array2 [element] | test_cookie.rs:42:14:42:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | +| test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 [element] | provenance | | +| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:11 | +| test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | test_cookie.rs:49:9:49:14 | array3 [element] | provenance | | +| test_cookie.rs:53:34:53:39 | array3 [element] | test_cookie.rs:53:14:53:32 | ...::from | provenance | MaD:2 Sink:MaD:2 | models | 1 | Sink: <_ as crypto_common::KeyInit>::new_from_slice; Argument[0]; credentials-key | -| 2 | Sink: ::new; Argument[0]; credentials-key | -| 3 | Sink: ::new; Argument[1]; credentials-iv | -| 4 | Sink: ::new; Argument[0]; credentials-key | -| 5 | Sink: ::new; Argument[1]; credentials-iv | -| 6 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | -| 7 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 2 | Sink: ::from; Argument[0]; credentials-key | +| 3 | Sink: ::new; Argument[0]; credentials-key | +| 4 | Sink: ::new; Argument[1]; credentials-iv | +| 5 | Sink: ::new; Argument[0]; credentials-key | +| 6 | Sink: ::new; Argument[1]; credentials-iv | +| 7 | Sink: ::from; Argument[0].Reference; credentials-key | +| 8 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | +| 9 | Summary: <_ as core::convert::From>::from; Argument[0]; ReturnValue; value | +| 10 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 11 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref, element] | semmle.label | const1 [&ref, element] | | test_cipher.rs:18:28:18:36 | &... [&ref, element] | semmle.label | &... [&ref, element] | @@ -119,4 +146,27 @@ nodes | test_cipher.rs:73:20:73:22 | 0u8 | semmle.label | 0u8 | | test_cipher.rs:74:23:74:44 | ...::new_from_slice | semmle.label | ...::new_from_slice | | test_cipher.rs:74:46:74:51 | const2 [&ref, element] | semmle.label | const2 [&ref, element] | +| test_cookie.rs:17:9:17:14 | array1 [element] | semmle.label | array1 [element] | +| test_cookie.rs:17:28:17:34 | [0; 64] [element] | semmle.label | [0; 64] [element] | +| test_cookie.rs:17:29:17:29 | 0 | semmle.label | 0 | +| test_cookie.rs:18:16:18:24 | ...::from | semmle.label | ...::from | +| test_cookie.rs:18:26:18:32 | &array1 [&ref, element] | semmle.label | &array1 [&ref, element] | +| test_cookie.rs:18:27:18:32 | array1 [element] | semmle.label | array1 [element] | +| test_cookie.rs:21:9:21:14 | array2 [element] | semmle.label | array2 [element] | +| test_cookie.rs:21:28:21:34 | [0; 64] [element] | semmle.label | [0; 64] [element] | +| test_cookie.rs:21:29:21:29 | 0 | semmle.label | 0 | +| test_cookie.rs:22:16:22:24 | ...::from | semmle.label | ...::from | +| test_cookie.rs:22:26:22:32 | &array2 [&ref, element] | semmle.label | &array2 [&ref, element] | +| test_cookie.rs:22:27:22:32 | array2 [element] | semmle.label | array2 [element] | +| test_cookie.rs:38:9:38:14 | array2 [element] | semmle.label | array2 [element] | +| test_cookie.rs:38:18:38:37 | ...::from(...) [element] | semmle.label | ...::from(...) [element] | +| test_cookie.rs:38:28:38:36 | [0u8; 64] [element] | semmle.label | [0u8; 64] [element] | +| test_cookie.rs:38:29:38:31 | 0u8 | semmle.label | 0u8 | +| test_cookie.rs:42:14:42:32 | ...::from | semmle.label | ...::from | +| test_cookie.rs:42:34:42:39 | array2 [element] | semmle.label | array2 [element] | +| test_cookie.rs:49:9:49:14 | array3 [element] | semmle.label | array3 [element] | +| test_cookie.rs:49:23:49:25 | 0u8 | semmle.label | 0u8 | +| test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | +| test_cookie.rs:53:14:53:32 | ...::from | semmle.label | ...::from | +| test_cookie.rs:53:34:53:39 | array3 [element] | semmle.label | array3 [element] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-798/options.yml b/rust/ql/test/query-tests/security/CWE-798/options.yml index 6713251d3ebd..9910923c8018 100644 --- a/rust/ql/test/query-tests/security/CWE-798/options.yml +++ b/rust/ql/test/query-tests/security/CWE-798/options.yml @@ -8,3 +8,5 @@ qltest_dependencies: - base64 = { version = "0.22.1" } - getrandom = { version = "0.3.1" } - getrandom2 = { package = "getrandom", version = "0.2.15" } + - cookie = { version = "0.18.1", features = ["signed", "private"] } + - biscotti = { version = "0.4.3" } diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs new file mode 100644 index 000000000000..10852583c678 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -0,0 +1,58 @@ + +use cookie::{CookieJar, SignedJar, PrivateJar, Key}; + +// --- tests --- + +fn test_cookie_jar(array_var: &[u8]) { + let mut jar = CookieJar::new(); + + let key_generate = Key::generate(); // good + _ = jar.signed_mut(&key_generate); + _ = jar.private_mut(&key_generate); + + let key_var = Key::from(array_var); // good + _ = jar.signed_mut(&key_var); + _ = jar.private_mut(&key_var); + + let array1: [u8; 64] = [0; 64]; // $ Alert[rust/hard-coded-cryptographic-value] + let key1 = Key::from(&array1); // $ Sink + _ = jar.signed_mut(&key1); + + let array2: [u8; 64] = [0; 64]; // $ Alert[rust/hard-coded-cryptographic-value] + let key2 = Key::from(&array2); // $ Sink + _ = jar.private_mut(&key2); +} + +fn test_biscotti_crypto(array_var: &[u8]) { + let mut config1 = biscotti::ProcessorConfig::default(); + let crypto_rules1 = biscotti::config::CryptoRule { + cookie_names: vec!["name".to_string()], + algorithm: biscotti::config::CryptoAlgorithm::Signing, + key: biscotti::Key::generate(), // good + fallbacks: vec![], + }; + config1.crypto_rules.push(crypto_rules1); + let processor1: biscotti::Processor = config1.into(); + + let mut config2 = biscotti::ProcessorConfig::default(); + let array2 = Vec::from([0u8; 64]); // $ Alert[rust/hard-coded-cryptographic-value] + let crypto_rules2 = biscotti::config::CryptoRule { + cookie_names: vec!["name".to_string()], + algorithm: biscotti::config::CryptoAlgorithm::Signing, + key: biscotti::Key::from(array2), // $ Sink + fallbacks: vec![], + }; + config2.crypto_rules.push(crypto_rules2); + let processor2: biscotti::Processor = config2.into(); + + let mut config3 = biscotti::ProcessorConfig::default(); + let array3 = vec![0u8; 64]; // $ Alert[rust/hard-coded-cryptographic-value] + let crypto_rules3 = biscotti::config::CryptoRule { + cookie_names: vec!["name".to_string()], + algorithm: biscotti::config::CryptoAlgorithm::Signing, + key: biscotti::Key::from(array3), // $ Sink + fallbacks: vec![], + }; + config3.crypto_rules.push(crypto_rules3); + let processor3: biscotti::Processor = config3.into(); +} diff --git a/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected new file mode 100644 index 000000000000..79371978cc02 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/CONSISTENCY/PathResolutionConsistency.expected @@ -0,0 +1,3 @@ +multipleCallTargets +| request_forgery_tests.rs:30:36:30:51 | user_url.as_str() | +| request_forgery_tests.rs:30:36:30:52 | user_url.as_str() | diff --git a/rust/ql/test/query-tests/security/CWE-918/Cargo.lock b/rust/ql/test/query-tests/security/CWE-918/Cargo.lock new file mode 100644 index 000000000000..83c077741bc7 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/Cargo.lock @@ -0,0 +1,1997 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.3+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" + +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "poem" +version = "3.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f977080932c87287147dca052951c3e2696f8759863f6b4e4c0c9ffe7a4cc8b" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http", + "http-body-util", + "hyper", + "hyper-util", + "mime", + "nix", + "parking_lot", + "percent-encoding", + "pin-project-lite", + "poem-derive", + "regex", + "rfc7239", + "serde", + "serde_json", + "serde_urlencoded", + "smallvec", + "sync_wrapper", + "thiserror", + "tokio", + "tokio-util", + "tracing", + "wildmatch", +] + +[[package]] +name = "poem-derive" +version = "3.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056e2fea6de1cb240ffe23cfc4fc370b629f8be83b5f27e16b7acd5231a72de4" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "redox_syscall" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rfc7239" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a82f1d1e38e9a85bb58ffcfadf22ed6f2c94e8cd8581ec2b0f80a2a6858350f" +dependencies = [ + "uncased", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustix" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "rustls" +version = "0.23.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.60.2", +] + +[[package]] +name = "test" +version = "0.0.1" +dependencies = [ + "poem", + "reqwest", + "tokio", +] + +[[package]] +name = "thiserror" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.3+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wildmatch" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ce1ab1f8c62655ebe1350f589c61e505cf94d385bc6a12899442d9081e71fd" + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winnow" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected new file mode 100644 index 000000000000..4d44df7349f7 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -0,0 +1,109 @@ +#select +| request_forgery_tests.rs:8:24:8:35 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:8:24:8:35 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:8:24:8:35 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:8:24:8:35 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:17:25:17:36 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:17:25:17:36 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:21:25:21:36 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:21:25:21:36 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:25:25:25:36 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:25:25:25:36 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:31:29:31:40 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:31:29:31:40 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:31:29:31:40 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:31:29:31:40 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:37:37:37:48 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:37:37:37:48 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +| request_forgery_tests.rs:37:37:37:48 | ...::get | request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:37:37:37:48 | ...::get | The URL of this request depends on a $@. | request_forgery_tests.rs:5:29:5:36 | user_url | user-provided value | +edges +| request_forgery_tests.rs:4:5:4:14 | res | request_forgery_tests.rs:16:27:16:49 | { ... } | provenance | | +| request_forgery_tests.rs:4:5:4:14 | res | request_forgery_tests.rs:20:27:20:57 | { ... } | provenance | | +| request_forgery_tests.rs:4:5:4:14 | res | request_forgery_tests.rs:24:27:24:70 | { ... } | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:8:38:8:45 | user_url | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:8:38:8:45 | user_url | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:16:27:16:49 | MacroExpr | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:20:27:20:57 | MacroExpr | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:24:27:24:70 | MacroExpr | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:31:43:31:50 | user_url | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:31:43:31:50 | user_url | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:37:51:37:58 | user_url | provenance | | +| request_forgery_tests.rs:5:29:5:36 | user_url | request_forgery_tests.rs:37:51:37:58 | user_url | provenance | | +| request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | request_forgery_tests.rs:8:24:8:35 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | request_forgery_tests.rs:8:24:8:35 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:8:38:8:45 | user_url | request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | provenance | | +| request_forgery_tests.rs:8:38:8:45 | user_url | request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | provenance | | +| request_forgery_tests.rs:16:13:16:15 | url | request_forgery_tests.rs:17:39:17:41 | url | provenance | | +| request_forgery_tests.rs:16:27:16:49 | ...::format(...) | request_forgery_tests.rs:4:5:4:14 | res | provenance | | +| request_forgery_tests.rs:16:27:16:49 | ...::must_use(...) | request_forgery_tests.rs:16:13:16:15 | url | provenance | | +| request_forgery_tests.rs:16:27:16:49 | MacroExpr | request_forgery_tests.rs:16:27:16:49 | ...::format(...) | provenance | MaD:2 | +| request_forgery_tests.rs:16:27:16:49 | { ... } | request_forgery_tests.rs:16:27:16:49 | ...::must_use(...) | provenance | MaD:3 | +| request_forgery_tests.rs:17:38:17:41 | &url [&ref] | request_forgery_tests.rs:17:25:17:36 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:17:39:17:41 | url | request_forgery_tests.rs:17:38:17:41 | &url [&ref] | provenance | | +| request_forgery_tests.rs:20:13:20:15 | url | request_forgery_tests.rs:21:39:21:41 | url | provenance | | +| request_forgery_tests.rs:20:27:20:57 | ...::format(...) | request_forgery_tests.rs:4:5:4:14 | res | provenance | | +| request_forgery_tests.rs:20:27:20:57 | ...::must_use(...) | request_forgery_tests.rs:20:13:20:15 | url | provenance | | +| request_forgery_tests.rs:20:27:20:57 | MacroExpr | request_forgery_tests.rs:20:27:20:57 | ...::format(...) | provenance | MaD:2 | +| request_forgery_tests.rs:20:27:20:57 | { ... } | request_forgery_tests.rs:20:27:20:57 | ...::must_use(...) | provenance | MaD:3 | +| request_forgery_tests.rs:21:38:21:41 | &url [&ref] | request_forgery_tests.rs:21:25:21:36 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:21:39:21:41 | url | request_forgery_tests.rs:21:38:21:41 | &url [&ref] | provenance | | +| request_forgery_tests.rs:24:13:24:15 | url | request_forgery_tests.rs:25:39:25:41 | url | provenance | | +| request_forgery_tests.rs:24:27:24:70 | ...::format(...) | request_forgery_tests.rs:4:5:4:14 | res | provenance | | +| request_forgery_tests.rs:24:27:24:70 | ...::must_use(...) | request_forgery_tests.rs:24:13:24:15 | url | provenance | | +| request_forgery_tests.rs:24:27:24:70 | MacroExpr | request_forgery_tests.rs:24:27:24:70 | ...::format(...) | provenance | MaD:2 | +| request_forgery_tests.rs:24:27:24:70 | { ... } | request_forgery_tests.rs:24:27:24:70 | ...::must_use(...) | provenance | MaD:3 | +| request_forgery_tests.rs:25:38:25:41 | &url [&ref] | request_forgery_tests.rs:25:25:25:36 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:25:39:25:41 | url | request_forgery_tests.rs:25:38:25:41 | &url [&ref] | provenance | | +| request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | request_forgery_tests.rs:31:29:31:40 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | request_forgery_tests.rs:31:29:31:40 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:31:43:31:50 | user_url | request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | provenance | | +| request_forgery_tests.rs:31:43:31:50 | user_url | request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | provenance | | +| request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | request_forgery_tests.rs:37:37:37:48 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | request_forgery_tests.rs:37:37:37:48 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| request_forgery_tests.rs:37:51:37:58 | user_url | request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | provenance | | +| request_forgery_tests.rs:37:51:37:58 | user_url | request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | provenance | | +models +| 1 | Sink: reqwest::get; Argument[0]; request-url | +| 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 3 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +nodes +| request_forgery_tests.rs:4:5:4:14 | res | semmle.label | res | +| request_forgery_tests.rs:4:5:4:14 | res | semmle.label | res | +| request_forgery_tests.rs:4:5:4:14 | res | semmle.label | res | +| request_forgery_tests.rs:5:29:5:36 | user_url | semmle.label | user_url | +| request_forgery_tests.rs:5:29:5:36 | user_url | semmle.label | user_url | +| request_forgery_tests.rs:8:24:8:35 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:8:24:8:35 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | semmle.label | &user_url [&ref] | +| request_forgery_tests.rs:8:37:8:45 | &user_url [&ref] | semmle.label | &user_url [&ref] | +| request_forgery_tests.rs:8:38:8:45 | user_url | semmle.label | user_url | +| request_forgery_tests.rs:8:38:8:45 | user_url | semmle.label | user_url | +| request_forgery_tests.rs:16:13:16:15 | url | semmle.label | url | +| request_forgery_tests.rs:16:27:16:49 | ...::format(...) | semmle.label | ...::format(...) | +| request_forgery_tests.rs:16:27:16:49 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| request_forgery_tests.rs:16:27:16:49 | MacroExpr | semmle.label | MacroExpr | +| request_forgery_tests.rs:16:27:16:49 | { ... } | semmle.label | { ... } | +| request_forgery_tests.rs:17:25:17:36 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:17:38:17:41 | &url [&ref] | semmle.label | &url [&ref] | +| request_forgery_tests.rs:17:39:17:41 | url | semmle.label | url | +| request_forgery_tests.rs:20:13:20:15 | url | semmle.label | url | +| request_forgery_tests.rs:20:27:20:57 | ...::format(...) | semmle.label | ...::format(...) | +| request_forgery_tests.rs:20:27:20:57 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| request_forgery_tests.rs:20:27:20:57 | MacroExpr | semmle.label | MacroExpr | +| request_forgery_tests.rs:20:27:20:57 | { ... } | semmle.label | { ... } | +| request_forgery_tests.rs:21:25:21:36 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:21:38:21:41 | &url [&ref] | semmle.label | &url [&ref] | +| request_forgery_tests.rs:21:39:21:41 | url | semmle.label | url | +| request_forgery_tests.rs:24:13:24:15 | url | semmle.label | url | +| request_forgery_tests.rs:24:27:24:70 | ...::format(...) | semmle.label | ...::format(...) | +| request_forgery_tests.rs:24:27:24:70 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| request_forgery_tests.rs:24:27:24:70 | MacroExpr | semmle.label | MacroExpr | +| request_forgery_tests.rs:24:27:24:70 | { ... } | semmle.label | { ... } | +| request_forgery_tests.rs:25:25:25:36 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:25:38:25:41 | &url [&ref] | semmle.label | &url [&ref] | +| request_forgery_tests.rs:25:39:25:41 | url | semmle.label | url | +| request_forgery_tests.rs:31:29:31:40 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:31:29:31:40 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | semmle.label | &user_url [&ref] | +| request_forgery_tests.rs:31:42:31:50 | &user_url [&ref] | semmle.label | &user_url [&ref] | +| request_forgery_tests.rs:31:43:31:50 | user_url | semmle.label | user_url | +| request_forgery_tests.rs:31:43:31:50 | user_url | semmle.label | user_url | +| request_forgery_tests.rs:37:37:37:48 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:37:37:37:48 | ...::get | semmle.label | ...::get | +| request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | semmle.label | &user_url [&ref] | +| request_forgery_tests.rs:37:50:37:58 | &user_url [&ref] | semmle.label | &user_url [&ref] | +| request_forgery_tests.rs:37:51:37:58 | user_url | semmle.label | user_url | +| request_forgery_tests.rs:37:51:37:58 | user_url | semmle.label | user_url | +subpaths diff --git a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.qlref b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.qlref new file mode 100644 index 000000000000..6ed39ea71f59 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-918/RequestForgery.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-918/main.rs b/rust/ql/test/query-tests/security/CWE-918/main.rs new file mode 100644 index 000000000000..6c5f536e97f0 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/main.rs @@ -0,0 +1,5 @@ +use test::request_forgery_tests; + +fn main() { + request_forgery_tests::start(); +} diff --git a/rust/ql/test/query-tests/security/CWE-918/options.yml b/rust/ql/test/query-tests/security/CWE-918/options.yml new file mode 100644 index 000000000000..078784053e14 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/options.yml @@ -0,0 +1,5 @@ +qltest_cargo_check: true +qltest_dependencies: + - reqwest = { version = "0.12.23", features = ["blocking", "json"] } + - tokio = { version = "1.0", features = ["full"] } + - poem = { version = "3.1.12", features = ["server"] } diff --git a/rust/ql/test/query-tests/security/CWE-918/request_forgery_tests.rs b/rust/ql/test/query-tests/security/CWE-918/request_forgery_tests.rs new file mode 100644 index 000000000000..d9f2e1ae5c4f --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-918/request_forgery_tests.rs @@ -0,0 +1,63 @@ +mod poem_server { + use poem::{handler, web::Query, Route, Server}; + + #[handler] + async fn endpoint(Query(user_url): Query, // $ Source=user_url + ) -> String { + // BAD: The user can control the entire URL + let response = reqwest::get(&user_url).await; // $ Alert[rust/request-forgery]=user_url + + // If this example is actually executed, forward the response text + if let Ok(resp) = response { + return resp.text().await.unwrap_or_default(); + } + + // BAD: The user can control a prefix of the URL + let url = format!("{}/resource", user_url); + let _response = reqwest::get(&url).await; // $ Alert[rust/request-forgery]=user_url + + // BAD: The user can control a prefix of the URL - only the protocol is restricted + let url = format!("https://{}/resource", user_url); + let _response = reqwest::get(&url).await; // $ Alert[rust/request-forgery]=user_url + + // GOOD: The user can only control a suffix after the hostname, this is likely ok + let url = format!("https://hostname.com/resource/{}", user_url); + let _response = reqwest::get(&url).await; // $ SPURIOUS: Alert[rust/request-forgery]=user_url + + let allowed_hosts = ["api.example.com", "trusted-service.com"]; + + // GOOD: The URL is guaranteed to be in the allowlist + if allowed_hosts.contains(&user_url.as_str()) { + let _response = reqwest::get(&user_url).await; // $ SPURIOUS: Alert[rust/request-forgery]=user_url + } + + if let Ok(url) = reqwest::Url::parse(&user_url) { + if let Some(host) = url.host_str() { + if allowed_hosts.contains(&host) { + let _response = reqwest::get(&user_url).await; // $ SPURIOUS: Alert[rust/request-forgery]=user_url + } + } + } + + "".to_string() + } + + // Function to create the Poem application + pub async fn create_app() -> Result<(), Box> { + let app = Route::new().at("/fetch", poem::get(endpoint)); + + Server::new(poem::listener::TcpListener::bind("127.0.0.1:8080")) + .run(app) + .await?; + + Ok(()) + } +} + +/// Start the Poem web application +pub fn start() { + tokio::runtime::Runtime::new() + .unwrap() + .block_on(poem_server::create_app()) + .unwrap(); +} diff --git a/shared/concepts/CHANGELOG.md b/shared/concepts/CHANGELOG.md index 88abeb21fd8c..bac19b9b77f2 100644 --- a/shared/concepts/CHANGELOG.md +++ b/shared/concepts/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.5 + +No user-facing changes. + ## 0.0.4 No user-facing changes. diff --git a/shared/concepts/change-notes/released/0.0.5.md b/shared/concepts/change-notes/released/0.0.5.md new file mode 100644 index 000000000000..766ec2723b56 --- /dev/null +++ b/shared/concepts/change-notes/released/0.0.5.md @@ -0,0 +1,3 @@ +## 0.0.5 + +No user-facing changes. diff --git a/shared/concepts/codeql-pack.release.yml b/shared/concepts/codeql-pack.release.yml index ec411a674bcd..bb45a1ab0182 100644 --- a/shared/concepts/codeql-pack.release.yml +++ b/shared/concepts/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.4 +lastReleaseVersion: 0.0.5 diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index bb5338db6d91..5bd473ce43bc 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.4 +version: 0.0.5 groups: shared library: true dependencies: diff --git a/shared/controlflow/CHANGELOG.md b/shared/controlflow/CHANGELOG.md index 7e3580fae376..9b9c04fd8d8d 100644 --- a/shared/controlflow/CHANGELOG.md +++ b/shared/controlflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.15 + +No user-facing changes. + ## 2.0.14 No user-facing changes. diff --git a/shared/controlflow/change-notes/released/2.0.15.md b/shared/controlflow/change-notes/released/2.0.15.md new file mode 100644 index 000000000000..3b59db4224a0 --- /dev/null +++ b/shared/controlflow/change-notes/released/2.0.15.md @@ -0,0 +1,3 @@ +## 2.0.15 + +No user-facing changes. diff --git a/shared/controlflow/codeql-pack.release.yml b/shared/controlflow/codeql-pack.release.yml index 23aa0864b298..0377ae283a31 100644 --- a/shared/controlflow/codeql-pack.release.yml +++ b/shared/controlflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.14 +lastReleaseVersion: 2.0.15 diff --git a/shared/controlflow/codeql/controlflow/BasicBlock.qll b/shared/controlflow/codeql/controlflow/BasicBlock.qll index 7aa541b46302..ed86ae5aa8be 100644 --- a/shared/controlflow/codeql/controlflow/BasicBlock.qll +++ b/shared/controlflow/codeql/controlflow/BasicBlock.qll @@ -9,17 +9,12 @@ overlay[local?] module; private import codeql.util.Location +private import SuccessorType /** Provides the language-specific input specification. */ signature module InputSig { - /** The type of a control flow successor. */ - class SuccessorType { - /** Gets a textual representation of this successor type. */ - string toString(); - } - /** Hold if `t` represents a conditional successor type. */ - predicate successorTypeIsCondition(SuccessorType t); + default predicate successorTypeIsCondition(SuccessorType t) { t instanceof ConditionalSuccessor } /** A delineated part of the AST with its own CFG. */ class CfgScope; @@ -61,12 +56,6 @@ signature module CfgSig { Location getLocation(); } - /** The type of a control flow successor. */ - class SuccessorType { - /** Gets a textual representation of this successor type. */ - string toString(); - } - /** * A basic block, that is, a maximal straight-line sequence of control flow nodes * without branches or joins. @@ -180,8 +169,6 @@ module Make Input> implements CfgSig { @@ -59,26 +60,11 @@ signature module InputSig { /** Holds if `scope` is exited when `last` finishes with completion `c`. */ predicate scopeLast(CfgScope scope, AstNode last, Completion c); - /** A type of a control flow successor. */ - class SuccessorType { - /** Gets a textual representation of this successor type. */ - string toString(); - } - /** Gets a successor type that matches completion `c`. */ SuccessorType getAMatchingSuccessorType(Completion c); - /** - * Hold if `t` represents simple (normal) evaluation of a statement or an - * expression. - */ - predicate successorTypeIsSimple(SuccessorType t); - /** Hold if `t` represents a conditional successor type. */ - predicate successorTypeIsCondition(SuccessorType t); - - /** Holds if `t` is an abnormal exit type out of a CFG scope. */ - predicate isAbnormalExitType(SuccessorType t); + default predicate successorTypeIsCondition(SuccessorType t) { t instanceof ConditionalSuccessor } /** * Gets an `id` of `node`. This is used to order the predecessors of a join @@ -522,7 +508,7 @@ module MakeWithSplitting< private predicate succEntrySplits(CfgScope pred, AstNode succ, Splits succSplits, SuccessorType t) { exists(int rnk | scopeFirst(pred, succ) and - successorTypeIsSimple(t) and + t instanceof DirectSuccessor and succEntrySplitsFromRank(pred, succ, succSplits, rnk) | rnk = 0 and @@ -959,6 +945,12 @@ module MakeWithSplitting< ) } + /** Holds if `t` is an abnormal exit type out of a CFG scope. */ + private predicate isAbnormalExitType(SuccessorType t) { + t instanceof ExceptionSuccessor or + t instanceof ExitSuccessor + } + /** * Internal representation of control flow nodes in the control flow graph. * The control flow graph is pruned for unreachable nodes. @@ -1016,7 +1008,7 @@ module MakeWithSplitting< exists(CfgScope scope | pred = TAnnotatedExitNode(scope, _) and result = TExitNode(scope) and - successorTypeIsSimple(t) + t instanceof DirectSuccessor ) } @@ -1320,7 +1312,7 @@ module MakeWithSplitting< label = strictconcat(SuccessorType t, string s | succ = getASuccessor(pred, t) and - if successorTypeIsSimple(t) then s = "" else s = t.toString() + if t instanceof DirectSuccessor then s = "" else s = t.toString() | s, ", " order by s ) @@ -1535,6 +1527,8 @@ module MakeWithSplitting< query predicate multipleSuccessors(Node node, SuccessorType t, Node successor) { strictcount(getASuccessor(node, t)) > 1 and successor = getASuccessor(node, t) and + // allow for multiple exception successors + not t instanceof ExceptionSuccessor and // allow for functions with multiple bodies not (t instanceof SimpleSuccessorType and node instanceof EntryNode) } @@ -1590,8 +1584,6 @@ module MakeWithSplitting< private class NodeAlias = Node; private module BasicBlockInputSig implements BB::InputSig { - class SuccessorType = Input::SuccessorType; - predicate successorTypeIsCondition = Input::successorTypeIsCondition/1; class CfgScope = CfgScopeAlias; diff --git a/shared/controlflow/codeql/controlflow/ControlFlow.qll b/shared/controlflow/codeql/controlflow/ControlFlow.qll new file mode 100644 index 000000000000..bfb878e67568 --- /dev/null +++ b/shared/controlflow/codeql/controlflow/ControlFlow.qll @@ -0,0 +1,929 @@ +/** + * Provides an implementation of local (intraprocedural) control flow reachability. + */ +overlay[local?] +module; + +private import codeql.controlflow.BasicBlock as BB +private import codeql.controlflow.SuccessorType +private import codeql.util.Boolean +private import codeql.util.Location +private import codeql.util.Option + +private signature class TypSig; + +signature module InputSig { + AstNode getEnclosingAstNode(ControlFlowNode node); + + class AstNode { + /** Gets a textual representation of this AST node. */ + string toString(); + + /** Gets the location of this AST node. */ + Location getLocation(); + } + + AstNode getParent(AstNode node); + + class Expr extends AstNode; + + class FinallyBlock extends AstNode; + + /** A variable that can be SSA converted. */ + class SourceVariable { + /** Gets a textual representation of this variable. */ + string toString(); + + /** Gets the location of this variable. */ + Location getLocation(); + } + + class SsaDefinition { + SourceVariable getSourceVariable(); + + predicate definesAt(SourceVariable v, BasicBlock bb, int i); + + /** Gets the basic block to which this SSA definition belongs. */ + BasicBlock getBasicBlock(); + + /** Gets a textual representation of this SSA definition. */ + string toString(); + + /** Gets the location of this SSA definition. */ + Location getLocation(); + + /** Holds if this SSA variable is live at the end of `b`. */ + predicate isLiveAtEndOfBlock(BasicBlock b); + } + + class SsaWriteDefinition extends SsaDefinition { + Expr getDefinition(); + } + + class SsaPhiNode extends SsaDefinition { + /** Holds if `inp` is an input to the phi node along the edge originating in `bb`. */ + predicate hasInputFromBlock(SsaDefinition inp, BasicBlock bb); + + SsaDefinition getAPhiInput(); + } + + class SsaUncertainDefinition extends SsaDefinition { + /** + * Gets the immediately preceding definition. Since this update is uncertain, + * the value from the preceding definition might still be valid. + */ + SsaDefinition getPriorDefinition(); + } + + /** An abstract value that a `Guard` may evaluate to. */ + class GuardValue { + /** Gets a textual representation of this value. */ + string toString(); + + /** + * Gets the dual value. Examples of dual values include: + * - null vs. not null + * - true vs. false + * - evaluating to a specific value vs. evaluating to any other value + * - throwing an exception vs. not throwing an exception + */ + GuardValue getDualValue(); + + /** Gets the integer that this value represents, if any. */ + int asIntValue(); + + /** + * Holds if this value represents an integer range. + * + * If `upper = true` the range is `(-infinity, bound]`. + * If `upper = false` the range is `[bound, infinity)`. + */ + predicate isIntRange(int bound, boolean upper); + } + + /** + * Holds if `def` evaluating to `v` controls the control-flow branch + * edge from `bb1` to `bb2`. That is, following the edge from `bb1` to + * `bb2` implies that `def` evaluated to `v`. + */ + predicate ssaControlsBranchEdge(SsaDefinition def, BasicBlock bb1, BasicBlock bb2, GuardValue v); + + /** + * Holds if `def` evaluating to `v` controls the basic block `bb`. + * That is, execution of `bb` implies that `def` evaluated to `v`. + */ + predicate ssaControls(SsaDefinition def, BasicBlock bb, GuardValue v); + + predicate exprHasValue(Expr e, GuardValue gv); + + bindingset[gv1, gv2] + predicate disjointValues(GuardValue gv1, GuardValue gv2); +} + +module Make< + LocationSig Location, BB::CfgSig Cfg, + InputSig Input> +{ + private module Cfg_ = Cfg; + + private import Cfg_ + private import Input + + final private class FinalAstNode = Input::AstNode; + + class AstNode extends FinalAstNode { + AstNode getParent() { result = getParent(this) } + } + + /** + * Holds if `node` is enclosed by `finally`. In case of nested finally + * blocks, this predicate only holds for the innermost block enclosing + * `node`. + */ + private predicate hasEnclosingFinally(AstNode node, FinallyBlock finally) { + node = finally + or + not node instanceof FinallyBlock and + hasEnclosingFinally(node.getParent(), finally) + } + + /** + * Holds if `inner` is nested within `outer`. + */ + private predicate nestedFinally(FinallyBlock inner, FinallyBlock outer) { + hasEnclosingFinally(inner.(AstNode).getParent(), outer) + } + + /** Gets the nesting depth of `finally` in terms of number of finally blocks. */ + private int finallyNestLevel(FinallyBlock finally) { + not nestedFinally(finally, _) and result = 1 + or + exists(FinallyBlock outer | + nestedFinally(finally, outer) and result = 1 + finallyNestLevel(outer) + ) + } + + private int maxFinallyNesting() { result = max(finallyNestLevel(_)) } + + private newtype TFinallyStack = + TNil() or + TCons(Boolean abrupt, FinallyStack tail) { tail.length() < maxFinallyNesting() } + + /** + * A stack of split values to track whether entered finally blocks have + * waiting completions. + */ + private class FinallyStack extends TFinallyStack { + string toString() { + result = "" and this = TNil() + or + exists(boolean abrupt, FinallyStack tail | + result = abrupt + ";" + tail.toString() and this = TCons(abrupt, tail) + ) + } + + /** Gets the length of this stack. */ + int length() { + result = 0 and this = TNil() + or + exists(FinallyStack tail | result = 1 + tail.length() and this = TCons(_, tail)) + } + + /** + * Gets the stack resulting from pushing information about entering a + * finally block through a specific edge onto this stack. + * + * The `abrupt` value indicates whether the edge has an `AbruptSuccessor` + * or not. + */ + FinallyStack enter(boolean abrupt) { result = TCons(abrupt, this) } + + /** + * Gets the stack resulting from popping a value, if any, consistent with + * leaving a finally block through a specific edge. + * + * The `abrupt` value indicates whether the edge has an `AbruptSuccessor` + * or not. + */ + FinallyStack leave(Boolean abrupt) { + this = TNil() and result = TNil() and exists(abrupt) + or + abrupt = false and this = TCons(false, result) + or + abrupt = true and this = TCons(_, result) + } + } + + private ControlFlowNode basicBlockEndPoint() { + result = any(BasicBlock bb).getNode(0) or + result = any(BasicBlock bb).getLastNode() + } + + private predicate inFinally(AstNode node, FinallyBlock finally) { + node = getEnclosingAstNode(basicBlockEndPoint()) and + hasEnclosingFinally(node, finally) + or + exists(FinallyBlock inner | nestedFinally(inner, finally) and inFinally(node, inner)) + } + + private predicate irrelevantFinally(FinallyBlock finally) { + exists(BasicBlock bb, AstNode n1, AstNode n2 | + n1 = getEnclosingAstNode(bb.getNode(0)) and + n2 = getEnclosingAstNode(bb.getLastNode()) + | + inFinally(n1, finally) and not inFinally(n2, finally) + or + not inFinally(n1, finally) and inFinally(n2, finally) + ) + } + + private predicate entersFinally( + BasicBlock bb1, BasicBlock bb2, boolean abrupt, FinallyBlock finally + ) { + exists(AstNode n1, AstNode n2, SuccessorType t | + not irrelevantFinally(finally) and + bb1.getASuccessor(t) = bb2 and + n1 = getEnclosingAstNode(bb1.getLastNode()) and + n2 = getEnclosingAstNode(bb2.getNode(0)) and + not inFinally(n1, finally) and + inFinally(n2, finally) and + if t instanceof AbruptSuccessor then abrupt = true else abrupt = false + ) + } + + private predicate leavesFinally( + BasicBlock bb1, BasicBlock bb2, boolean abrupt, FinallyBlock finally + ) { + exists(AstNode n1, AstNode n2, SuccessorType t | + not irrelevantFinally(finally) and + bb1.getASuccessor(t) = bb2 and + n1 = getEnclosingAstNode(bb1.getLastNode()) and + n2 = getEnclosingAstNode(bb2.getNode(0)) and + inFinally(n1, finally) and + not inFinally(n2, finally) and + if t instanceof AbruptSuccessor then abrupt = true else abrupt = false + ) + } + + /** Holds if `gv1` is a strict subset of `gv2`. */ + bindingset[gv1, gv2] + private predicate smaller(GuardValue gv1, GuardValue gv2) { + disjointValues(gv1, gv2.getDualValue()) and + gv1 != gv2 + } + + /** + * Holds if the value of `def` is `gv`. + * + * If multiple values apply, then we only include the most precise ones. + */ + private predicate ssaHasValue(SsaWriteDefinition def, GuardValue gv) { + exists(Expr e | + def.getDefinition() = e and + exprHasValue(e, gv) and + not exists(GuardValue gv0 | exprHasValue(e, gv0) and smaller(gv0, gv)) + ) + } + + pragma[nomagic] + private predicate ssaLiveAtEndOfBlock(SourceVariable var, SsaDefinition def, BasicBlock bb) { + def.getSourceVariable() = var and + def.isLiveAtEndOfBlock(bb) + } + + pragma[nomagic] + private predicate initSsaValue0(SourceVariable var, BasicBlock bb, SsaDefinition t, GuardValue val) { + ssaLiveAtEndOfBlock(var, t, bb) and + ( + ssaControls(t, bb, val) + or + ssaHasValue(t, val) + ) + } + + /** + * Holds if the value of `t` in `bb` is `val` and that `t` is live at the + * end of `bb`. + * + * If multiple values apply, then we only include the most precise ones. + * + * The underlying variable of `t` is `var`. + */ + private predicate initSsaValue(SourceVariable var, BasicBlock bb, SsaDefinition t, GuardValue val) { + initSsaValue0(var, bb, t, val) and + not exists(GuardValue val0 | initSsaValue0(var, bb, t, val0) and smaller(val0, val)) + } + + private predicate possibleValue(SourceVariable var, GuardValue gv) { + exists(SsaDefinition def | def.getSourceVariable() = var | + ssaHasValue(def, gv) + or + ssaControlsBranchEdge(def, _, _, gv) + ) + } + + private predicate possibleRangeBound(SourceVariable var, int bound, boolean upper) { + exists(GuardValue gv | possibleValue(var, gv) and gv.isIntRange(bound, upper)) + } + + private predicate possibleClosedRange(SourceVariable var, int low, int high) { + possibleRangeBound(var, low, false) and + possibleRangeBound(var, high, true) and + low < high + } + + private newtype TGuardValueExt = + AnyValue() or + BaseValue(GuardValue gv) { possibleValue(_, gv) } or + IntRange(int low, int high) { possibleClosedRange(_, low, high) } + + private class GuardValueExt extends TGuardValueExt { + string toString() { + result = "Any" and this = AnyValue() + or + result = this.asBase().toString() + or + exists(int low, int high | + this = IntRange(low, high) and result = "[" + low + ", " + high + "]" + ) + } + + GuardValue asBase() { this = BaseValue(result) } + } + + private class TGuardValueOrAny = AnyValue or BaseValue; + + private class GuardValueOrAny extends GuardValueExt, TGuardValueOrAny { } + + private GuardValueExt mkRange(int low, int high) { + result = IntRange(low, high) + or + low = high and + result.asBase().asIntValue() = low + } + + private GuardValueExt intersectBase1(GuardValue gv1, GuardValue gv2) { + exists(SourceVariable var | + possibleValue(var, gv1) and + possibleValue(var, gv2) + | + smaller(gv1, gv2) and result.asBase() = gv1 + or + exists(int low, int high | + gv1.isIntRange(low, false) and + gv2.isIntRange(high, true) and + result = mkRange(low, high) + ) + or + exists(int bound, boolean upper, int d | + gv1.isIntRange(bound, upper) and + gv2.getDualValue().asIntValue() = bound and + result.asBase().isIntRange(bound + d, upper) + | + upper = true and d = -1 + or + upper = false and d = 1 + ) + ) + } + + private GuardValueExt intersectBase2(GuardValueExt v1, GuardValue v2) { + result = intersectBase1(v1.asBase(), v2) + or + result = intersectBase1(v2, v1.asBase()) + } + + bindingset[v1, v2] + pragma[inline_late] + private GuardValueExt intersectRange(GuardValueExt v1, GuardValue v2) { + exists(int low, int high | v1 = IntRange(low, high) | + exists(int bound, boolean upper | v2.isIntRange(bound, upper) | + upper = true and result = mkRange(low, high.minimum(bound)) + or + upper = false and result = mkRange(low.maximum(bound), high) + ) + or + exists(int k | + v2.asIntValue() = k and + result.asBase() = v2 and + low <= k and + k <= high + ) + or + not v2.isIntRange(_, _) and not exists(v2.asIntValue()) and result = v1 + ) + } + + bindingset[v1, v2] + pragma[inline_late] + private GuardValueExt intersect(GuardValueExt v1, GuardValue v2) { + v1 = AnyValue() and result.asBase() = v2 + or + result = intersectBase2(v1, v2) + or + result = v1 and + v1 instanceof BaseValue and + not exists(intersectBase2(v1, v2)) + or + result = intersectRange(v1, v2) + } + + bindingset[v1, gv2] + private predicate disjointValuesExt(GuardValueExt v1, GuardValue gv2) { + disjointValues(v1.asBase(), gv2) + or + exists(int low, int high | v1 = IntRange(low, high) | + gv2.asIntValue() < low + or + high < gv2.asIntValue() + or + exists(int bound, boolean upper | gv2.isIntRange(bound, upper) | + upper = true and bound < low + or + upper = false and high < bound + ) + ) + } + + /** An input configuration for control flow reachability. */ + signature module ConfigSig { + /** + * Holds if the value of `def` at `node` is a source for the reachability + * computation. + */ + predicate source(ControlFlowNode node, SsaDefinition def); + + /** + * Holds if the value of `def` at `node` is a sink for the reachability + * computation. + */ + predicate sink(ControlFlowNode node, SsaDefinition def); + + /** + * Holds if the value of `gv` is a barrier for the reachability computation. + * That is, paths where the tracked variable can be inferred to have the + * value of `gv` are excluded from the reachability analysis. + */ + default predicate barrierValue(GuardValue gv) { none() } + + /** + * Holds if the edge from `bb1` to `bb2` should be excluded from the + * reachability analysis. + */ + default predicate barrierEdge(BasicBlock bb1, BasicBlock bb2) { none() } + + /** + * Holds if flow through uncertain SSA updates should be included. + */ + default predicate uncertainFlow() { any() } + } + + /** + * Constructs a control flow reachability computation. + */ + module Flow { + private predicate ssaRelevantAtEndOfBlock(SsaDefinition def, BasicBlock bb) { + def.isLiveAtEndOfBlock(bb) + or + def.getBasicBlock().strictlyPostDominates(bb) + } + + pragma[nomagic] + private predicate isSource( + ControlFlowNode src, SsaDefinition srcDef, SourceVariable var, BasicBlock bb, int i + ) { + Config::source(src, srcDef) and + bb.getNode(i) = src and + srcDef.getSourceVariable() = var + } + + pragma[nomagic] + private predicate isSink( + ControlFlowNode sink, SsaDefinition sinkDef, SourceVariable var, BasicBlock bb, int i + ) { + Config::sink(sink, sinkDef) and + bb.getNode(i) = sink and + sinkDef.getSourceVariable() = var + } + + private predicate uncertainStep(SsaDefinition def1, SsaDefinition def2) { + def2.(SsaUncertainDefinition).getPriorDefinition() = def1 and + Config::uncertainFlow() + } + + private predicate intraBlockStep(SsaDefinition def1, SsaDefinition def2) { + exists(BasicBlock bb | + uncertainStep(def1, def2) and + bb = def2.getBasicBlock() and + isSource(_, _, _, bb, _) and + isSink(_, _, _, bb, _) + ) + } + + private predicate intraBlockFlowAll( + ControlFlowNode src, SsaDefinition srcDef, int i, ControlFlowNode sink, SsaDefinition sinkDef, + int j + ) { + exists(SourceVariable var, BasicBlock bb | + isSource(src, srcDef, var, bb, i) and + isSink(sink, sinkDef, var, bb, j) and + i <= j and + intraBlockStep*(srcDef, sinkDef) + ) + } + + private predicate intraBlockFlow( + ControlFlowNode src, SsaDefinition srcDef, ControlFlowNode sink, SsaDefinition sinkDef + ) { + exists(int i, int j | + intraBlockFlowAll(src, srcDef, i, sink, sinkDef, j) and + not exists(int k | + intraBlockFlowAll(src, srcDef, i, _, _, k) and + k < j + ) + ) + } + + private predicate sourceBlock(SsaDefinition def, BasicBlock bb, ControlFlowNode src) { + isSource(src, def, _, bb, _) and + not intraBlockFlow(src, def, _, _) + } + + private predicate sinkBlock(SsaDefinition def, BasicBlock bb, ControlFlowNode sink) { + sink = + min(ControlFlowNode n, int i | bb.getNode(i) = n and Config::sink(n, def) | n order by i) + } + + /** + * Holds if the edge from `bb1` to `bb2` implies that `def` has a value + * that is considered a barrier. + */ + private predicate ssaValueBarrierEdge(SsaDefinition def, BasicBlock bb1, BasicBlock bb2) { + exists(GuardValue v | + ssaControlsBranchEdge(def, bb1, bb2, v) and + Config::barrierValue(v) + ) + } + + /** Holds if `def1` in `bb1` may step to `def2` in `bb2`. */ + private predicate step(SsaDefinition def1, BasicBlock bb1, SsaDefinition def2, BasicBlock bb2) { + not sinkBlock(def1, bb1, _) and + not Config::barrierEdge(bb1, bb2) and + not ssaValueBarrierEdge(def1, bb1, bb2) and + ( + def2.(SsaPhiNode).hasInputFromBlock(def1, bb1) and bb2 = def2.getBasicBlock() + or + exists(SourceVariable v | + ssaRelevantAtEndOfBlock(def1, bb1) and + bb1.getASuccessor() = bb2 and + v = def1.getSourceVariable() and + not exists(SsaPhiNode phi | phi.getBasicBlock() = bb2 and phi.getSourceVariable() = v) and + def1 = def2 + ) + or + uncertainStep(def1, def2) and + bb2 = def2.getBasicBlock() and + bb1 = bb2 + ) + } + + bindingset[bb1, bb2, fs1] + pragma[inline_late] + private predicate stepFinallyStack( + BasicBlock bb1, BasicBlock bb2, FinallyStack fs1, FinallyStack fs2 + ) { + exists(boolean abrupt | entersFinally(bb1, bb2, abrupt, _) and fs2 = fs1.enter(abrupt)) and + not leavesFinally(bb1, bb2, _, _) + or + exists(boolean abrupt | leavesFinally(bb1, bb2, abrupt, _) and fs2 = fs1.leave(abrupt)) and + not entersFinally(bb1, bb2, _, _) + or + exists(boolean abrupt | + leavesFinally(bb1, bb2, abrupt, _) and + entersFinally(bb1, bb2, abrupt, _) and + fs2 = fs1.leave(abrupt).enter(abrupt) + ) + or + not entersFinally(bb1, bb2, _, _) and not leavesFinally(bb1, bb2, _, _) and fs2 = fs1 + } + + /** + * Holds if the source `srcDef` in `srcBb` may reach `def` in `bb`. If the + * path has entered one or more finally blocks then `fs` tracks the + * `SuccessorType`s of the edges entering those blocks. + */ + private predicate sourceReachesBlock( + SsaDefinition srcDef, BasicBlock srcBb, SsaDefinition def, BasicBlock bb, FinallyStack fs + ) { + sourceBlock(srcDef, srcBb, _) and + def = srcDef and + bb = srcBb and + fs = TNil() + or + exists(SsaDefinition middef, BasicBlock midbb, FinallyStack midfs | + sourceReachesBlock(srcDef, srcBb, middef, midbb, midfs) and + step(middef, midbb, def, bb) and + stepFinallyStack(midbb, bb, midfs, fs) + ) + } + + /** + * Holds if `def` in `bb` is reachable from a source and may reach a sink. + */ + private predicate blockReachesSink(SsaDefinition def, BasicBlock bb) { + sourceReachesBlock(_, _, def, bb, _) and + ( + sinkBlock(def, bb, _) + or + exists(SsaDefinition middef, BasicBlock midbb | + step(def, bb, middef, midbb) and + blockReachesSink(middef, midbb) + ) + ) + } + + private predicate escapeCandidate(SsaDefinition def, BasicBlock bb) { + sourceBlock(def, bb, _) + or + exists(SsaDefinition middef, BasicBlock midbb | + blockReachesSink(middef, midbb) and + step(middef, midbb, def, bb) + ) + } + + /** + * Holds if the source `srcDef` in `srcBb` may reach `escDef` in `escBb` and from + * there cannot reach a sink. + */ + private predicate sourceEscapesSink( + SsaDefinition srcDef, BasicBlock srcBb, SsaDefinition escDef, BasicBlock escBb + ) { + sourceReachesBlock(srcDef, srcBb, escDef, escBb, _) and + escapeCandidate(escDef, escBb) and + not blockReachesSink(escDef, escBb) + } + + /** Holds if `bb` is a relevant block for computing reachability of `src`. */ + private predicate pathBlock(SourceVariable src, BasicBlock bb) { + exists(SsaDefinition def | def.getSourceVariable() = src | + blockReachesSink(def, bb) + or + escapeCandidate(def, bb) + ) + } + + /** + * Holds if `bb1` to `bb2` is a relevant edge for computing reachability + * of `src`. + */ + private predicate pathEdge(SourceVariable src, BasicBlock bb1, BasicBlock bb2) { + step(_, bb1, _, bb2) and + pathBlock(pragma[only_bind_into](src), bb1) and + pathBlock(pragma[only_bind_into](src), bb2) and + bb1 != bb2 + } + + /** + * Holds if the edge from `bb1` to `bb2` implies that `def` has the value + * `gv` and that the edge is relevant for computing reachability of `src`. + * + * If multiple values may be implied by this edge, then we only include the + * most precise ones. + * + * The underlying variable of `t` is `var`. + */ + private predicate ssaControlsPathEdge( + SourceVariable src, SsaDefinition t, SourceVariable var, GuardValue gv, BasicBlock bb1, + BasicBlock bb2 + ) { + ssaControlsBranchEdge(t, bb1, bb2, gv) and + not exists(GuardValue gv0 | ssaControlsBranchEdge(t, bb1, bb2, gv0) and smaller(gv0, gv)) and + pathEdge(src, bb1, bb2) and + t.getSourceVariable() = var + } + + /** + * Holds if the reachability path for `src` may go through a loop with + * entry point `entry`. + */ + pragma[nomagic] + private predicate loopEntryBlock(SourceVariable src, BasicBlock entry) { + exists(BasicBlock pred | pathEdge(src, pred, entry) and entry.strictlyDominates(pred)) + } + + /** + * Holds if precision may be improved by splitting control flow on the + * value of `var` during the reachability computation of `src`. + */ + private predicate relevantSplit(SourceVariable src, SourceVariable var) { + // `var` may be a relevant split if we encounter 2+ conditional edges + // that imply information about `var`. + 2 <= strictcount(BasicBlock bb1 | ssaControlsPathEdge(src, _, var, _, bb1, _)) + or + // Or if we encounter a conditional edge that imply a value that's + // incompatible with an initial or later assigned value. + exists(GuardValue gv1, GuardValue gv2, BasicBlock bb | + ssaControlsPathEdge(src, _, var, gv1, _, _) and + initSsaValue(var, bb, _, gv2) and + disjointValues(gv1, gv2) and + pathBlock(src, bb) + ) + or + // Or if we encounter a conditional edge in a loop that imply a value for + // `var` that may be unchanged from one iteration to the next. + exists(SsaDefinition def, BasicBlock bb1, BasicBlock bb2, BasicBlock loopEntry | + ssaControlsPathEdge(src, def, var, _, bb1, bb2) and + loopEntryBlock(src, loopEntry) and + loopEntry.strictlyDominates(bb1) and + bb2.getASuccessor*() = loopEntry + | + def.getBasicBlock().dominates(loopEntry) + or + exists(SsaPhiNode phi | + phi.definesAt(var, loopEntry, _) and + phi.getAPhiInput+() = def and + def.(SsaPhiNode).getAPhiInput*() = phi + ) + ) + } + + private module SsaDefOption = Option; + + private class SsaDefOption = SsaDefOption::Option; + + private predicate lastDefInBlock(SourceVariable var, SsaDefinition def, BasicBlock bb) { + def = max(SsaDefinition d, int i | d.definesAt(var, bb, i) | d order by i) + } + + /** + * Holds if `bb1` to `bb2` is a relevant edge for computing reachability of + * `src`, and `var` is a relevant splitting variable that gets (re-)defined + * in `bb2` by `t`, which is not a phi node. + * + * `val` is the best known value for `t` in `bb2`. + */ + private predicate stepSsaValueRedef( + SourceVariable src, BasicBlock bb1, BasicBlock bb2, SourceVariable var, SsaDefinition t, + GuardValueOrAny val + ) { + pathEdge(src, bb1, bb2) and + relevantSplit(src, var) and + lastDefInBlock(var, t, bb2) and + not t instanceof SsaPhiNode and + ( + ssaHasValue(t, val.asBase()) + or + not ssaHasValue(t, _) and val = AnyValue() + ) + } + + /** + * Holds if `bb1` to `bb2` is a relevant edge for computing reachability of + * `src`, and `var` is a relevant splitting variable that has a phi node, + * `t2`, in `bb2` taking input from `t1` along this edge. Furthermore, + * there is no further redefinition of `var` in `bb2`. + * + * `val` is the best value for `t1`/`t2` implied by taking this edge. + */ + private predicate stepSsaValuePhi( + SourceVariable src, BasicBlock bb1, BasicBlock bb2, SourceVariable var, SsaDefinition t1, + SsaDefinition t2, GuardValueOrAny val + ) { + pathEdge(src, bb1, bb2) and + relevantSplit(src, var) and + lastDefInBlock(var, t2, bb2) and + t2.(SsaPhiNode).hasInputFromBlock(t1, bb1) and + ( + ssaControlsPathEdge(src, t1, _, val.asBase(), bb1, bb2) + or + not ssaControlsPathEdge(src, t1, _, _, bb1, bb2) and + val = AnyValue() + ) + } + + /** + * Holds if `bb1` to `bb2` is a relevant edge for computing reachability of + * `src`, and `var` is a relevant splitting variable that has no + * redefinition along this edge nor in `bb2`. + * + * Additionally, this edge implies that the SSA definition `t` of `var` has + * value `val`. + */ + private predicate stepSsaValueNoRedef( + SourceVariable src, BasicBlock bb1, BasicBlock bb2, SourceVariable var, SsaDefinition t, + GuardValue val + ) { + pathEdge(src, bb1, bb2) and + relevantSplit(src, var) and + not lastDefInBlock(var, _, bb2) and + ssaControlsPathEdge(src, t, var, val, bb1, bb2) + } + + /** + * Holds if the source `srcDef` in `srcBb` may reach `def` in `bb`. The + * taken path takes splitting based on the value of `var` into account. + * The pair `(tracked, val)` is the current SSA definition and known value + * for `var` in `bb`. + */ + private predicate sourceReachesBlockWithTrackedVar( + SsaDefinition srcDef, BasicBlock srcBb, SsaDefinition def, BasicBlock bb, FinallyStack fs, + SsaDefOption tracked, GuardValueExt val, SourceVariable var + ) { + sourceBlock(srcDef, srcBb, _) and + def = srcDef and + bb = srcBb and + fs = TNil() and + relevantSplit(def.getSourceVariable(), var) and + ( + // tracking variable is not yet live + not ssaLiveAtEndOfBlock(var, _, bb) and + tracked.isNone() and + val = AnyValue() + or + // tracking variable is live but without known value + ssaLiveAtEndOfBlock(var, tracked.asSome(), bb) and + not initSsaValue(var, bb, _, _) and + val = AnyValue() + or + // tracking variable has known value + initSsaValue(var, bb, tracked.asSome(), val.asBase()) + ) + or + exists( + SourceVariable src, SsaDefinition middef, BasicBlock midbb, FinallyStack midfs, + SsaDefOption tracked0, GuardValueExt val0 + | + sourceReachesBlockWithTrackedVar(srcDef, srcBb, middef, midbb, midfs, tracked0, val0, var) and + src = srcDef.getSourceVariable() and + step(middef, midbb, def, bb) and + stepFinallyStack(midbb, bb, midfs, fs) and + pathBlock(src, bb) and + not exists(GuardValue gv | + ssaControlsPathEdge(src, tracked0.asSome(), _, gv, midbb, bb) and + disjointValuesExt(val0, gv) + ) + | + // tracking variable is redefined + stepSsaValueRedef(src, midbb, bb, var, tracked.asSome(), val) + or + exists(GuardValueOrAny val1 | + // tracking variable has a phi node, and maybe value information from the edge + stepSsaValuePhi(src, midbb, bb, var, tracked0.asSome(), tracked.asSome(), val1) + | + val = val0 and val1 = AnyValue() + or + val = intersect(val0, val1.asBase()) + ) + or + exists(GuardValue val1 | + // tracking variable is unchanged, and has value information from the edge + stepSsaValueNoRedef(src, midbb, bb, var, tracked0.asSome(), val1) and + tracked = tracked0 and + val = intersect(val0, val1) + ) + or + // tracking variable is unchanged, and has no value information from the edge + not lastDefInBlock(var, _, bb) and + not stepSsaValueNoRedef(src, midbb, bb, var, tracked0.asSome(), _) and + tracked = tracked0 and + val = val0 + ) + } + + /** + * Holds if the source `srcDef` at `src` may reach the sink `sinkDef` at `sink`. + */ + predicate flow( + ControlFlowNode src, SsaDefinition srcDef, ControlFlowNode sink, SsaDefinition sinkDef + ) { + intraBlockFlow(src, srcDef, sink, sinkDef) + or + exists(BasicBlock srcBb, BasicBlock sinkBb, SourceVariable srcVar | + sourceBlock(srcDef, srcBb, src) and + sourceReachesBlock(srcDef, srcBb, sinkDef, sinkBb, _) and + sinkBlock(sinkDef, sinkBb, sink) and + srcVar = srcDef.getSourceVariable() and + forall(SourceVariable t | relevantSplit(srcVar, t) | + sourceReachesBlockWithTrackedVar(srcDef, srcBb, sinkDef, sinkBb, _, _, _, t) + ) + ) + } + + /** + * Holds if the source `srcDef` at `src` may escape, that is, there exists + * a path from `src` that circumvents all sinks to a point from which no + * sink is reachable. + */ + predicate escapeFlow(ControlFlowNode src, SsaDefinition srcDef) { + not intraBlockFlow(src, srcDef, _, _) and + exists(BasicBlock srcBb, SsaDefinition escDef, BasicBlock escBb, SourceVariable srcVar | + sourceBlock(srcDef, srcBb, src) and + sourceEscapesSink(srcDef, srcBb, escDef, escBb) and + srcVar = srcDef.getSourceVariable() and + forall(SourceVariable t | relevantSplit(srcVar, t) | + sourceReachesBlockWithTrackedVar(srcDef, srcBb, escDef, escBb, _, _, _, t) + ) + ) + } + } +} diff --git a/shared/controlflow/codeql/controlflow/Guards.qll b/shared/controlflow/codeql/controlflow/Guards.qll index f39cb67b7e1a..0bbfb29e4e64 100644 --- a/shared/controlflow/codeql/controlflow/Guards.qll +++ b/shared/controlflow/codeql/controlflow/Guards.qll @@ -51,25 +51,13 @@ overlay[local?] module; private import codeql.controlflow.BasicBlock as BB +private import codeql.controlflow.SuccessorType private import codeql.util.Boolean private import codeql.util.Location private import codeql.util.Unit signature class TypSig; -signature module SuccessorTypesSig { - class ExceptionSuccessor extends SuccessorType; - - class ConditionalSuccessor extends SuccessorType { - /** Gets the Boolean value of this successor. */ - boolean getValue(); - } - - class BooleanSuccessor extends ConditionalSuccessor; - - class NullnessSuccessor extends ConditionalSuccessor; -} - signature module InputSig { /** A control flow node indicating normal termination of a callable. */ class NormalExitNode extends ControlFlowNode; @@ -205,13 +193,11 @@ signature module InputSig Cfg, - SuccessorTypesSig SuccessorTypes, InputSig Input> { private module Cfg_ = Cfg; private import Cfg_ - private import SuccessorTypes private import Input private newtype TAbstractSingleValue = @@ -222,6 +208,12 @@ module Make< private newtype TGuardValue = TValue(TAbstractSingleValue val, Boolean isVal) or + TIntRange(int bound, Boolean upper) { + exists(ConstantExpr c | c.asIntegerValue() + [-1, 0, 1] = bound) and + // exclude edge cases to avoid overflow issues when computing duals + bound != 2147483647 and + bound != -2147483648 + } or TException(Boolean throws) private class AbstractSingleValue extends TAbstractSingleValue { @@ -252,6 +244,15 @@ module Make< result = TValue(val, isVal.booleanNot()) ) or + exists(int bound, int d, boolean upper | + upper = true and d = 1 + or + upper = false and d = -1 + | + this = TIntRange(bound, pragma[only_bind_into](upper)) and + result = TIntRange(bound + d, pragma[only_bind_into](upper.booleanNot())) + ) + or exists(boolean throws | this = TException(throws) and result = TException(throws.booleanNot()) @@ -276,6 +277,14 @@ module Make< /** Gets the constant that this value represents, if any. */ ConstantValue asConstantValue() { this = TValue(TValueConstant(result), true) } + /** + * Holds if this value represents an integer range. + * + * If `upper = true` the range is `(-infinity, bound]`. + * If `upper = false` the range is `[bound, infinity)`. + */ + predicate isIntRange(int bound, boolean upper) { this = TIntRange(bound, upper) } + /** Holds if this value represents throwing an exception. */ predicate isThrowsException() { this = TException(true) } @@ -289,6 +298,12 @@ module Make< this = TValue(val, false) and result = "not " + val.toString() ) or + exists(int bound | + this = TIntRange(bound, true) and result = "Upper bound " + bound.toString() + or + this = TIntRange(bound, false) and result = "Lower bound " + bound.toString() + ) + or exists(boolean throws | this = TException(throws) | throws = true and result = "exception" or @@ -307,6 +322,24 @@ module Make< b = TValue(b1, true) and a1 != b1 ) + or + exists(int upperbound, int lowerbound | + a = TIntRange(upperbound, true) and b = TIntRange(lowerbound, false) + or + b = TIntRange(upperbound, true) and a = TIntRange(lowerbound, false) + | + upperbound < lowerbound + ) + or + exists(int bound, boolean upper, int k | + a = TIntRange(bound, upper) and b.asIntValue() = k + or + b = TIntRange(bound, upper) and a.asIntValue() = k + | + upper = true and bound < k + or + upper = false and bound > k + ) } private predicate constantHasValue(ConstantExpr c, GuardValue v) { @@ -695,38 +728,22 @@ module Make< ) } - /** Holds if `e` may take the value `k` */ - private predicate relevantInt(Expr e, int k) { - e.(ConstantExpr).asIntegerValue() = k - or - relevantInt(any(Expr e1 | valueStep(e1, e)), k) - or - exists(SsaDefinition def | - guardReadsSsaVar(e, def) and - relevantInt(getAnUltimateDefinition(def, _).(SsaWriteDefinition).getDefinition(), k) - ) - } - private predicate impliesStep1(Guard g1, GuardValue v1, Guard g2, GuardValue v2) { baseImpliesStep(g1, v1, g2, v2) or - exists(SsaDefinition def, Expr e | + exists(SsaDefinition def, Expr e, BasicBlock bb1 | // If `def = g2 ? v1 : ...` and all other assignments to `def` are different from // `v1` then a guard proving `def == v1` ensures that `g2` evaluates to `v2`. uniqueValue(def, e, v1) and guardReadsSsaVar(g1, def) and g2.directlyValueControls(e.getBasicBlock(), v2) and - not g2.directlyValueControls(g1.getBasicBlock(), v2) + bb1 = g1.getBasicBlock() and + not g2.directlyValueControls(bb1, v2) ) or - exists(int k1, int k2, boolean upper | - rangeGuard(g1, v1, g2, k1, upper) and - relevantInt(g2, k2) and - v2 = TValue(TValueInt(k2), false) - | - upper = true and k1 < k2 // g2 <= k1 < k2 ==> g2 != k2 - or - upper = false and k1 > k2 // g2 >= k1 > k2 ==> g2 != k2 + exists(int k, boolean upper | + rangeGuard(g1, v1, g2, k, upper) and + v2 = TIntRange(k, upper) ) or exists(boolean isNull | @@ -758,6 +775,10 @@ module Make< or exprHasValue(e.(IdExpr).getEqualChildExpr(), v) or + exists(ConditionalExpr cond | cond = e | + exprHasValue(cond.getThen(), v) and exprHasValue(cond.getElse(), v) + ) + or exists(SsaDefinition def, Guard g, GuardValue gv | e = def.getARead() and g.directlyValueControls(e.getBasicBlock(), gv) and @@ -1227,5 +1248,16 @@ module Make< this.valueControls(bb, any(GuardValue gv | gv.asBooleanValue() = branch)) } } + + private predicate exprHasValueAlias = exprHasValue/2; + + private predicate disjointValuesAlias = disjointValues/2; + + /** Provides utility predicates for working with `GuardValue`s. */ + module InternalUtil { + predicate exprHasValue = exprHasValueAlias/2; + + predicate disjointValues = disjointValuesAlias/2; + } } } diff --git a/shared/controlflow/codeql/controlflow/SuccessorType.qll b/shared/controlflow/codeql/controlflow/SuccessorType.qll new file mode 100644 index 000000000000..cc673c9e5cab --- /dev/null +++ b/shared/controlflow/codeql/controlflow/SuccessorType.qll @@ -0,0 +1,343 @@ +/** + * Provides different types of control flow successor types. These are used as + * edge labels in the control flow graph. + * + * ```text + * SuccessorType + * |- NormalSuccessor + * | |- DirectSuccessor + * | \- ConditionalSuccessor + * | |- BooleanSuccessor + * | |- NullnessSuccessor + * | |- MatchingSuccessor + * | \- EmptinessSuccessor + * \- AbruptSuccessor + * |- ExceptionSuccessor + * |- ReturnSuccessor + * |- ExitSuccessor (program termination) + * \- JumpSuccessor + * |- BreakSuccessor + * |- ContinueSuccessor + * |- GotoSuccessor + * |- RedoSuccessor // rare, used in Ruby + * \- RetrySuccessor // rare, used in Ruby + * ``` + */ +overlay[local] +module; + +private import codeql.util.Boolean + +private newtype TSuccessorType = + TDirectSuccessor() or + TBooleanSuccessor(Boolean branch) or + TNullnessSuccessor(Boolean isNull) or + TMatchingSuccessor(Boolean isMatch) or + TEmptinessSuccessor(Boolean isEmpty) or + TExceptionSuccessor() or + TReturnSuccessor() or + TExitSuccessor() or + TBreakSuccessor() or + TContinueSuccessor() or + TGotoSuccessor() or + TRedoSuccessor() or + TRetrySuccessor() + +/** + * The type of a control flow successor. + * + * A successor is either normal, which covers direct and conditional + * successors, or abrupt, which covers all other types of successors including + * for example exceptions, returns, and other jumps. + */ +private class SuccessorTypeImpl extends TSuccessorType { + /** Gets a textual representation of this successor type. */ + abstract string toString(); +} + +final class SuccessorType = SuccessorTypeImpl; + +private class TNormalSuccessor = TDirectSuccessor or TConditionalSuccessor; + +/** + * A normal control flow successor. This is either a direct or a conditional + * successor. + */ +abstract private class NormalSuccessorImpl extends SuccessorTypeImpl, TNormalSuccessor { } + +final class NormalSuccessor = NormalSuccessorImpl; + +/** A direct control flow successor. */ +class DirectSuccessor extends NormalSuccessorImpl, TDirectSuccessor { + override string toString() { result = "successor" } +} + +private class TConditionalSuccessor = + TBooleanSuccessor or TMatchingSuccessor or TNullnessSuccessor or TEmptinessSuccessor; + +/** + * A conditional control flow successor. Either a Boolean successor (`BooleanSuccessor`), + * a nullness successor (`NullnessSuccessor`), a matching successor (`MatchingSuccessor`), + * or an emptiness successor (`EmptinessSuccessor`). + */ +abstract private class ConditionalSuccessorImpl extends NormalSuccessorImpl, TConditionalSuccessor { + /** Gets the Boolean value of this successor. */ + abstract boolean getValue(); +} + +final class ConditionalSuccessor = ConditionalSuccessorImpl; + +/** + * A Boolean control flow successor. + * + * For example, this program fragment: + * + * ```csharp + * if (x < 0) + * return 0; + * else + * return 1; + * ``` + * + * has a control flow graph containing Boolean successors: + * + * ```text + * if + * | + * x < 0 + * / \ + * / \ + * / \ + * true false + * | \ + * return 0 return 1 + * ``` + */ +class BooleanSuccessor extends ConditionalSuccessorImpl, TBooleanSuccessor { + override boolean getValue() { this = TBooleanSuccessor(result) } + + override string toString() { result = this.getValue().toString() } +} + +/** + * A nullness control flow successor. + * + * For example, this program fragment: + * + * ```csharp + * int? M(string s) => s?.Length; + * ``` + * + * has a control flow graph containing nullness successors: + * + * ```text + * enter M + * | + * s + * / \ + * / \ + * / \ + * null non-null + * \ | + * \ Length + * \ / + * \ / + * exit M + * ``` + */ +class NullnessSuccessor extends ConditionalSuccessorImpl, TNullnessSuccessor { + /** Holds if this is a `null` successor. */ + predicate isNull() { this = TNullnessSuccessor(true) } + + override boolean getValue() { this = TNullnessSuccessor(result) } + + override string toString() { if this.isNull() then result = "null" else result = "non-null" } +} + +/** + * A matching control flow successor. + * + * For example, this program fragment: + * + * ```csharp + * switch (x) { + * case 0 : + * return 0; + * default : + * return 1; + * } + * ``` + * + * has a control flow graph containing matching successors: + * + * ```text + * switch + * | + * x + * | + * case 0 + * / \ + * / \ + * / \ + * match no-match + * | \ + * return 0 default + * | + * return 1 + * ``` + */ +class MatchingSuccessor extends ConditionalSuccessorImpl, TMatchingSuccessor { + /** Holds if this is a match successor. */ + predicate isMatch() { this = TMatchingSuccessor(true) } + + override boolean getValue() { this = TMatchingSuccessor(result) } + + override string toString() { if this.isMatch() then result = "match" else result = "no-match" } +} + +/** + * An emptiness control flow successor. + * + * For example, this program fragment: + * + * ```csharp + * foreach (var arg in args) + * { + * yield return arg; + * } + * yield return ""; + * ``` + * + * has a control flow graph containing emptiness successors: + * + * ```text + * args + * | + * loop-header------<----- + * / \ \ + * / \ | + * / \ | + * / \ | + * empty non-empty | + * | \ | + * yield return "" \ | + * var arg | + * | | + * yield return arg | + * \_________/ + * ``` + */ +class EmptinessSuccessor extends ConditionalSuccessorImpl, TEmptinessSuccessor { + /** Holds if this is an empty successor. */ + predicate isEmpty() { this = TEmptinessSuccessor(true) } + + override boolean getValue() { this = TEmptinessSuccessor(result) } + + override string toString() { if this.isEmpty() then result = "empty" else result = "non-empty" } +} + +private class TAbruptSuccessor = + TExceptionSuccessor or TReturnSuccessor or TExitSuccessor or TJumpSuccessor; + +/** An abrupt control flow successor. */ +abstract private class AbruptSuccessorImpl extends SuccessorTypeImpl, TAbruptSuccessor { } + +final class AbruptSuccessor = AbruptSuccessorImpl; + +/** + * An exceptional control flow successor. + * + * Example: + * + * ```csharp + * int M(string s) + * { + * if (s == null) + * throw new ArgumentNullException(nameof(s)); + * return s.Length; + * } + * ``` + * + * The callable exit node of `M` is an exceptional successor of the node + * `throw new ArgumentNullException(nameof(s));`. + */ +class ExceptionSuccessor extends AbruptSuccessorImpl, TExceptionSuccessor { + override string toString() { result = "exception" } +} + +/** + * A `return` control flow successor. + * + * Example: + * + * ```csharp + * void M() + * { + * return; + * } + * ``` + * + * The callable exit node of `M` is a `return` successor of the `return;` + * statement. + */ +class ReturnSuccessor extends AbruptSuccessorImpl, TReturnSuccessor { + override string toString() { result = "return" } +} + +/** + * An exit control flow successor. + * + * Example: + * + * ```csharp + * int M(string s) + * { + * if (s == null) + * System.Environment.Exit(0); + * return s.Length; + * } + * ``` + * + * The callable exit node of `M` is an exit successor of the node on line 4. + */ +class ExitSuccessor extends AbruptSuccessorImpl, TExitSuccessor { + override string toString() { result = "exit" } +} + +private class TJumpSuccessor = + TBreakSuccessor or TContinueSuccessor or TGotoSuccessor or TRedoSuccessor or TRetrySuccessor; + +/** + * A jump control flow successor. + * + * This covers non-exceptional, non-local control flow, such as `break`, + * `continue`, and `goto`. + */ +abstract private class JumpSuccessorImpl extends AbruptSuccessorImpl, TJumpSuccessor { } + +final class JumpSuccessor = JumpSuccessorImpl; + +/** A `break` control flow successor. */ +class BreakSuccessor extends JumpSuccessorImpl, TBreakSuccessor { + override string toString() { result = "break" } +} + +/** A `continue` control flow successor. */ +class ContinueSuccessor extends JumpSuccessorImpl, TContinueSuccessor { + override string toString() { result = "continue" } +} + +/** A `goto` control flow successor. */ +class GotoSuccessor extends JumpSuccessorImpl, TGotoSuccessor { + override string toString() { result = "goto" } +} + +/** A `redo` control flow successor (rare, used in Ruby). */ +class RedoSuccessor extends JumpSuccessorImpl, TRedoSuccessor { + override string toString() { result = "redo" } +} + +/** A `retry` control flow successor (rare, used in Ruby). */ +class RetrySuccessor extends JumpSuccessorImpl, TRetrySuccessor { + override string toString() { result = "retry" } +} diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index 09b18b15e93f..ab574bfdbac6 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.14 +version: 2.0.15 groups: shared library: true dependencies: diff --git a/shared/dataflow/CHANGELOG.md b/shared/dataflow/CHANGELOG.md index b5b86ffbccba..1a867888e89d 100644 --- a/shared/dataflow/CHANGELOG.md +++ b/shared/dataflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.15 + +No user-facing changes. + ## 2.0.14 No user-facing changes. diff --git a/shared/dataflow/change-notes/released/2.0.15.md b/shared/dataflow/change-notes/released/2.0.15.md new file mode 100644 index 000000000000..3b59db4224a0 --- /dev/null +++ b/shared/dataflow/change-notes/released/2.0.15.md @@ -0,0 +1,3 @@ +## 2.0.15 + +No user-facing changes. diff --git a/shared/dataflow/codeql-pack.release.yml b/shared/dataflow/codeql-pack.release.yml index 23aa0864b298..0377ae283a31 100644 --- a/shared/dataflow/codeql-pack.release.yml +++ b/shared/dataflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.14 +lastReleaseVersion: 2.0.15 diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll index 83abd41f5e6e..8f0d2cbdb771 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImplConsistency.qll @@ -254,7 +254,10 @@ module MakeConsistency< query predicate postWithInFlow(PostUpdateNode n, string msg) { not clearsContent(n, _) and - simpleLocalFlowStep(_, n, _) and + exists(Node pred | + simpleLocalFlowStep(pred, n, _) and + not pred instanceof PostUpdateNode + ) and not Input::postWithInFlowExclude(n) and msg = "PostUpdateNode should not be the target of local flow." } diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index d0a78e01e0a9..9799550c8361 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.0.14 +version: 2.0.15 groups: shared library: true dependencies: diff --git a/shared/mad/CHANGELOG.md b/shared/mad/CHANGELOG.md index bd3e670038ce..e6cf183a1d4d 100644 --- a/shared/mad/CHANGELOG.md +++ b/shared/mad/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/mad/change-notes/released/1.0.31.md b/shared/mad/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/mad/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/mad/codeql-pack.release.yml b/shared/mad/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/mad/codeql-pack.release.yml +++ b/shared/mad/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/mad/codeql/mad/ModelValidation.qll b/shared/mad/codeql/mad/ModelValidation.qll index 018c1797ddcd..5d4698bed1d4 100644 --- a/shared/mad/codeql/mad/ModelValidation.qll +++ b/shared/mad/codeql/mad/ModelValidation.qll @@ -39,7 +39,7 @@ module KindValidation { "response-splitting", "trust-boundary-violation", "template-injection", "url-forward", "xslt-injection", // JavaScript-only currently, but may be shared in the future - "mongodb.sink", + "cors-origin", "mongodb.sink", // Swift-only currently, but may be shared in the future "database-store", "format-string", "hash-iteration-count", "predicate-injection", "preferences-store", "tls-protocol-version", "transmission", "webview-fetch", "xxe", diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index bd421a6ebb88..e974c131a88b 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.30 +version: 1.0.31 groups: shared library: true dependencies: diff --git a/shared/quantum/CHANGELOG.md b/shared/quantum/CHANGELOG.md index fba2a8703562..a59e560c4155 100644 --- a/shared/quantum/CHANGELOG.md +++ b/shared/quantum/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.9 + +No user-facing changes. + ## 0.0.8 No user-facing changes. diff --git a/shared/quantum/change-notes/released/0.0.9.md b/shared/quantum/change-notes/released/0.0.9.md new file mode 100644 index 000000000000..c9e17c6d6cf2 --- /dev/null +++ b/shared/quantum/change-notes/released/0.0.9.md @@ -0,0 +1,3 @@ +## 0.0.9 + +No user-facing changes. diff --git a/shared/quantum/codeql-pack.release.yml b/shared/quantum/codeql-pack.release.yml index 58fdc6b45deb..ecdd64fbab86 100644 --- a/shared/quantum/codeql-pack.release.yml +++ b/shared/quantum/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.8 +lastReleaseVersion: 0.0.9 diff --git a/shared/quantum/codeql/quantum/experimental/Model.qll b/shared/quantum/codeql/quantum/experimental/Model.qll index d8b1402b5e88..d97b6af2b990 100644 --- a/shared/quantum/codeql/quantum/experimental/Model.qll +++ b/shared/quantum/codeql/quantum/experimental/Model.qll @@ -365,7 +365,7 @@ module CryptographyBase Input> { */ abstract class ArtifactConsumer extends ConsumerElement { /** - * Use `getAKnownArtifactSource() instead. The behaviour of these two predicates is equivalent. + * Use `getAKnownArtifactSource() instead. The behavior of these two predicates is equivalent. */ final override KnownElement getAKnownSource() { result = this.getAKnownArtifactSource() } @@ -1841,9 +1841,7 @@ module CryptographyBase Input> { * An SCRYPT key derivation algorithm node. */ class ScryptAlgorithmNode extends KeyDerivationAlgorithmNode { - ScryptAlgorithmInstance scryptInstance; - - ScryptAlgorithmNode() { scryptInstance = instance.asAlg() } + ScryptAlgorithmNode() { instance.asAlg() instanceof ScryptAlgorithmInstance } /** * Gets the iteration count (`N`) argument diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index 220edda5d931..8f5a9260f27a 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.8 +version: 0.0.9 groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/CHANGELOG.md b/shared/rangeanalysis/CHANGELOG.md index e64dff3b1e69..104664809001 100644 --- a/shared/rangeanalysis/CHANGELOG.md +++ b/shared/rangeanalysis/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/rangeanalysis/change-notes/released/1.0.31.md b/shared/rangeanalysis/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/rangeanalysis/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/rangeanalysis/codeql-pack.release.yml b/shared/rangeanalysis/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/rangeanalysis/codeql-pack.release.yml +++ b/shared/rangeanalysis/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index 56f2327b4bfd..bea42fd1b619 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.30 +version: 1.0.31 groups: shared library: true dependencies: diff --git a/shared/regex/CHANGELOG.md b/shared/regex/CHANGELOG.md index 11353af62b14..3b3fcb5a55f7 100644 --- a/shared/regex/CHANGELOG.md +++ b/shared/regex/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/regex/change-notes/released/1.0.31.md b/shared/regex/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/regex/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/regex/codeql-pack.release.yml b/shared/regex/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/regex/codeql-pack.release.yml +++ b/shared/regex/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index 0e81cc29880b..28cdc4285882 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.30 +version: 1.0.31 groups: shared library: true dependencies: diff --git a/shared/ssa/CHANGELOG.md b/shared/ssa/CHANGELOG.md index 5a9cf1a7175a..e7e17bf044b2 100644 --- a/shared/ssa/CHANGELOG.md +++ b/shared/ssa/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.7 + +No user-facing changes. + ## 2.0.6 No user-facing changes. diff --git a/shared/ssa/change-notes/released/2.0.7.md b/shared/ssa/change-notes/released/2.0.7.md new file mode 100644 index 000000000000..4eb1353458c2 --- /dev/null +++ b/shared/ssa/change-notes/released/2.0.7.md @@ -0,0 +1,3 @@ +## 2.0.7 + +No user-facing changes. diff --git a/shared/ssa/codeql-pack.release.yml b/shared/ssa/codeql-pack.release.yml index fbbc03c76427..08d5e9594498 100644 --- a/shared/ssa/codeql-pack.release.yml +++ b/shared/ssa/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.6 +lastReleaseVersion: 2.0.7 diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index 905456d7859f..a944c9d7ab4c 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.6 +version: 2.0.7 groups: shared library: true dependencies: diff --git a/shared/threat-models/CHANGELOG.md b/shared/threat-models/CHANGELOG.md index c30f8de8bc9b..d50406235570 100644 --- a/shared/threat-models/CHANGELOG.md +++ b/shared/threat-models/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/threat-models/change-notes/released/1.0.31.md b/shared/threat-models/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/threat-models/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/threat-models/codeql-pack.release.yml b/shared/threat-models/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/threat-models/codeql-pack.release.yml +++ b/shared/threat-models/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 3bb1891658d2..005cbadd38b1 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.30 +version: 1.0.31 library: true groups: shared dataExtensions: diff --git a/shared/tutorial/CHANGELOG.md b/shared/tutorial/CHANGELOG.md index 61441b610612..f4a80412ca8c 100644 --- a/shared/tutorial/CHANGELOG.md +++ b/shared/tutorial/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/tutorial/change-notes/released/1.0.31.md b/shared/tutorial/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/tutorial/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/tutorial/codeql-pack.release.yml b/shared/tutorial/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/tutorial/codeql-pack.release.yml +++ b/shared/tutorial/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 7c3ec5193c35..09f9013ac103 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.30 +version: 1.0.31 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/CHANGELOG.md b/shared/typeflow/CHANGELOG.md index 94df766d756c..bf4296980228 100644 --- a/shared/typeflow/CHANGELOG.md +++ b/shared/typeflow/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/typeflow/change-notes/released/1.0.31.md b/shared/typeflow/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/typeflow/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/typeflow/codeql-pack.release.yml b/shared/typeflow/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/typeflow/codeql-pack.release.yml +++ b/shared/typeflow/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index f4912ea54902..b777138b0008 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.30 +version: 1.0.31 groups: shared library: true dependencies: diff --git a/shared/typeinference/CHANGELOG.md b/shared/typeinference/CHANGELOG.md index d9dd6b6f2e25..83a42fb05515 100644 --- a/shared/typeinference/CHANGELOG.md +++ b/shared/typeinference/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.0.12 + +No user-facing changes. + ## 0.0.11 No user-facing changes. diff --git a/shared/typeinference/change-notes/released/0.0.12.md b/shared/typeinference/change-notes/released/0.0.12.md new file mode 100644 index 000000000000..0e206033bc47 --- /dev/null +++ b/shared/typeinference/change-notes/released/0.0.12.md @@ -0,0 +1,3 @@ +## 0.0.12 + +No user-facing changes. diff --git a/shared/typeinference/codeql-pack.release.yml b/shared/typeinference/codeql-pack.release.yml index e679dc420925..997fb8da83cd 100644 --- a/shared/typeinference/codeql-pack.release.yml +++ b/shared/typeinference/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 0.0.11 +lastReleaseVersion: 0.0.12 diff --git a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll index 32615dc46cd6..2cc557ff3071 100644 --- a/shared/typeinference/codeql/typeinference/internal/TypeInference.qll +++ b/shared/typeinference/codeql/typeinference/internal/TypeInference.qll @@ -494,6 +494,13 @@ module Make1 Input1> { module Make2 { private import Input2 + final private class FinalTypeMention = TypeMention; + + /** An adapter for type mentions to implement `HasTypeTreeSig`. */ + final class TypeMentionTypeTree extends FinalTypeMention { + Type getTypeAt(TypePath path) { result = this.resolveTypeAt(path) } + } + /** Gets the type at the empty path of `tm`. */ bindingset[tm] pragma[inline_late] @@ -502,7 +509,7 @@ module Make1 Input1> { } /** Provides the input to `IsInstantiationOf`. */ - signature module IsInstantiationOfInputSig { + signature module IsInstantiationOfInputSig { /** * Holds if `abs` is a type abstraction, `tm` occurs in the scope of * `abs`, and `app` is potentially an application/instantiation of `abs`. @@ -523,46 +530,45 @@ module Make1 Input1> { * accessing the `bar` method of `foo` potentially instantiates the `impl` * block with a type argument for `A`. */ - predicate potentialInstantiationOf(App app, TypeAbstraction abs, TypeMention tm); + predicate potentialInstantiationOf(App app, TypeAbstraction abs, Constraint tm); /** * Holds if `constraint` might occur as the third argument of * `potentialInstantiationOf`. Defaults to simply projecting the third * argument of `potentialInstantiationOf`. */ - default predicate relevantTypeMention(TypeMention tm) { potentialInstantiationOf(_, _, tm) } + default predicate relevantTypeMention(Constraint tm) { potentialInstantiationOf(_, _, tm) } } /** * Provides functionality for determining if a type is a possible * instantiation of a type mention containing type parameters. */ - module IsInstantiationOf Input> { + module IsInstantiationOf< + HasTypeTreeSig App, HasTypeTreeSig Constraint, + IsInstantiationOfInputSig Input> + { private import Input /** Gets the `i`th path in `tm` per some arbitrary order. */ pragma[nomagic] - private TypePath getNthPath(TypeMention tm, int i) { + private TypePath getNthPath(Constraint tm, int i) { result = - rank[i + 1](TypePath path | - exists(tm.resolveTypeAt(path)) and relevantTypeMention(tm) - | - path - ) + rank[i + 1](TypePath path | exists(tm.getTypeAt(path)) and relevantTypeMention(tm) | path) } pragma[nomagic] private Type resolveNthTypeAt( - App app, TypeAbstraction abs, TypeMention tm, int i, TypePath path + App app, TypeAbstraction abs, Constraint tm, int i, TypePath path ) { potentialInstantiationOf(app, abs, tm) and path = getNthPath(tm, i) and - result = tm.resolveTypeAt(path) + result = tm.getTypeAt(path) } pragma[nomagic] private predicate satisfiesConcreteTypesFromIndex( - App app, TypeAbstraction abs, TypeMention tm, int i + App app, TypeAbstraction abs, Constraint tm, int i ) { exists(Type t, TypePath path | t = resolveNthTypeAt(app, abs, tm, i, path) and @@ -574,7 +580,7 @@ module Make1 Input1> { /** Holds if all the concrete types in `tm` also occur in `app`. */ pragma[nomagic] - private predicate satisfiesConcreteTypes(App app, TypeAbstraction abs, TypeMention tm) { + private predicate satisfiesConcreteTypes(App app, TypeAbstraction abs, Constraint tm) { satisfiesConcreteTypesFromIndex(app, abs, tm, max(int i | exists(getNthPath(tm, i)))) } @@ -592,14 +598,14 @@ module Make1 Input1> { * arbitrary order, if any. */ pragma[nomagic] - private TypePath getNthTypeParameterPath(TypeMention tm, TypeParameter tp, int i) { + private TypePath getNthTypeParameterPath(Constraint tm, TypeParameter tp, int i) { result = - rank[i + 1](TypePath path | tp = tm.resolveTypeAt(path) and relevantTypeMention(tm) | path) + rank[i + 1](TypePath path | tp = tm.getTypeAt(path) and relevantTypeMention(tm) | path) } pragma[nomagic] private predicate typeParametersEqualFromIndexBase( - App app, TypeAbstraction abs, TypeMention tm, TypeParameter tp, TypePath path + App app, TypeAbstraction abs, Constraint tm, TypeParameter tp, TypePath path ) { path = getNthTypeParameterPath(tm, tp, 0) and satisfiesConcreteTypes(app, abs, tm) and @@ -609,7 +615,7 @@ module Make1 Input1> { pragma[nomagic] private predicate typeParametersEqualFromIndex( - App app, TypeAbstraction abs, TypeMention tm, TypeParameter tp, Type t, int i + App app, TypeAbstraction abs, Constraint tm, TypeParameter tp, Type t, int i ) { exists(TypePath path | t = app.getTypeAt(path) and @@ -623,7 +629,7 @@ module Make1 Input1> { } private predicate typeParametersEqual( - App app, TypeAbstraction abs, TypeMention tm, TypeParameter tp + App app, TypeAbstraction abs, Constraint tm, TypeParameter tp ) { satisfiesConcreteTypes(app, abs, tm) and tp = getNthTypeParameter(abs, _) and @@ -639,7 +645,7 @@ module Make1 Input1> { } private predicate typeParametersHaveEqualInstantiationFromIndex( - App app, TypeAbstraction abs, TypeMention tm, int i + App app, TypeAbstraction abs, Constraint tm, int i ) { exists(TypeParameter tp | tp = getNthTypeParameter(abs, i) | typeParametersEqual(app, abs, tm, tp) and @@ -662,7 +668,7 @@ module Make1 Input1> { * - `Pair` is _not_ an instantiation of `Pair` */ pragma[nomagic] - predicate isInstantiationOf(App app, TypeAbstraction abs, TypeMention tm) { + predicate isInstantiationOf(App app, TypeAbstraction abs, Constraint tm) { // We only need to check equality if the concrete types are satisfied. satisfiesConcreteTypes(app, abs, tm) and // Check if all the places where the same type parameter occurs in `tm` @@ -684,7 +690,7 @@ module Make1 Input1> { * Holds if `app` is _not_ a possible instantiation of `tm`. */ pragma[nomagic] - predicate isNotInstantiationOf(App app, TypeAbstraction abs, TypeMention tm) { + predicate isNotInstantiationOf(App app, TypeAbstraction abs, Constraint tm) { // `app` and `tm` differ on a concrete type exists(Type t, TypePath path | t = resolveNthTypeAt(app, abs, tm, _, path) and @@ -721,14 +727,8 @@ module Make1 Input1> { ) } - final private class FinalTypeMention = TypeMention; - - final private class TypeMentionTypeTree extends FinalTypeMention { - Type getTypeAt(TypePath path) { result = this.resolveTypeAt(path) } - } - private module IsInstantiationOfInput implements - IsInstantiationOfInputSig + IsInstantiationOfInputSig { pragma[nomagic] private predicate typeCondition( @@ -745,7 +745,7 @@ module Make1 Input1> { } predicate potentialInstantiationOf( - TypeMentionTypeTree constraint, TypeAbstraction abs, TypeMention condition + TypeMentionTypeTree constraint, TypeAbstraction abs, TypeMentionTypeTree condition ) { exists(Type type | typeConstraint(type, constraint) and typeCondition(type, abs, condition) @@ -769,7 +769,7 @@ module Make1 Input1> { conditionSatisfiesConstraint(abs, condition, midConstraint) and // NOTE: `midAbs` describe the free type variables in `midCondition`, hence // we use that for instantiation check. - IsInstantiationOf::isInstantiationOf(midConstraint, + IsInstantiationOf::isInstantiationOf(midConstraint, midAbs, midCondition) | conditionSatisfiesConstraintTypeAt(midAbs, midCondition, constraint, path, t) and @@ -919,6 +919,15 @@ module Make1 Input1> { signature module SatisfiesConstraintInputSig { /** Holds if it is relevant to know if `term` satisfies `constraint`. */ predicate relevantConstraint(HasTypeTree term, Type constraint); + + /** + * Holds if constraints that are satisfied through conditions that are + * universally quantified type parameters should be used. Such type + * parameters might have type parameter constraints, and these are _not_ + * checked. Hence using these represent a trade-off between too many + * constraints and too few constraints being satisfied. + */ + default predicate useUniversalConditions() { any() } } module SatisfiesConstraint< @@ -933,8 +942,12 @@ module Make1 Input1> { relevantConstraint(term, constraint) } - private module IsInstantiationOfInput implements IsInstantiationOfInputSig { - predicate potentialInstantiationOf(HasTypeTree tt, TypeAbstraction abs, TypeMention cond) { + private module IsInstantiationOfInput implements + IsInstantiationOfInputSig + { + predicate potentialInstantiationOf( + HasTypeTree tt, TypeAbstraction abs, TypeMentionTypeTree cond + ) { exists(Type constraint, Type type | hasTypeConstraint(tt, type, constraint) and rootTypesSatisfaction(type, constraint, abs, cond, _) and @@ -943,7 +956,7 @@ module Make1 Input1> { ) } - predicate relevantTypeMention(TypeMention constraint) { + predicate relevantTypeMention(TypeMentionTypeTree constraint) { rootTypesSatisfaction(_, _, _, constraint, _) } } @@ -957,6 +970,7 @@ module Make1 Input1> { TypeMention constraintMention ) { exists(Type type | hasTypeConstraint(tt, type, constraint) | + useUniversalConditions() and not exists(countConstraintImplementations(type, constraint)) and conditionSatisfiesConstraintTypeAt(abs, condition, constraintMention, _, _) and resolveTypeMentionRoot(condition) = abs.getATypeParameter() and @@ -969,8 +983,8 @@ module Make1 Input1> { // one where the type instantiates the precondition. if multipleConstraintImplementations(type, constraint) then - IsInstantiationOf::isInstantiationOf(tt, abs, - condition) + IsInstantiationOf::isInstantiationOf(tt, + abs, condition) else any() ) } @@ -1018,8 +1032,8 @@ module Make1 Input1> { } } - /** Provides the input to `Matching`. */ - signature module MatchingInputSig { + /** Provides the input to `MatchingWithEnvironment`. */ + signature module MatchingWithEnvironmentInputSig { /** * A position inside a declaration. For example, the integer position of a * parameter inside a method or the return type of a method. @@ -1064,6 +1078,14 @@ module Make1 Input1> { string toString(); } + /** An environment to track during type matching. */ + bindingset[this] + class AccessEnvironment { + /** Gets a textual representation of this environment. */ + bindingset[this] + string toString(); + } + /** An access that targets a declaration, for example a method call. */ class Access { /** Gets a textual representation of this access. */ @@ -1082,15 +1104,17 @@ module Make1 Input1> { Type getTypeArgument(TypeArgumentPosition tapos, TypePath path); /** - * Gets the inferred type at `path` for the position `apos` of this access. + * Gets the inferred type at `path` for the position `apos` and environment `e` + * of this access. * * For example, if this access is the method call `M(42)`, then the inferred * type at argument position `0` is `int`. */ - Type getInferredType(AccessPosition apos, TypePath path); + bindingset[e] + Type getInferredType(AccessEnvironment e, AccessPosition apos, TypePath path); - /** Gets the declaration that this access targets. */ - Declaration getTarget(); + /** Gets the declaration that this access targets in environment `e`. */ + Declaration getTarget(AccessEnvironment e); } /** Holds if `apos` and `dpos` match. */ @@ -1128,20 +1152,21 @@ module Make1 Input1> { * * Matching takes both base types and explicit type arguments into account. */ - module Matching { + module MatchingWithEnvironment { private import Input /** - * Holds if `a` targets `target` and the type for `apos` at `path` in `a` - * is `t` after adjustment by `target`. + * Holds if `a` targets `target` in environment `e` and the type for `apos` at `path` + * in `a` is `t` after adjustment by `target`. */ pragma[nomagic] private predicate adjustedAccessType( - Access a, AccessPosition apos, Declaration target, TypePath path, Type t + Access a, AccessEnvironment e, AccessPosition apos, Declaration target, TypePath path, + Type t ) { - target = a.getTarget() and + target = a.getTarget(e) and exists(TypePath path0, Type t0 | - t0 = a.getInferredType(apos, path0) and + t0 = a.getInferredType(e, apos, path0) and adjustAccessType(apos, target, path0, t0, path, t) ) } @@ -1165,47 +1190,53 @@ module Make1 Input1> { } /** - * Holds if the type `t` at `path` of `a` matches the type parameter `tp` - * of `target`. + * Holds if the type `t` at `path` of `a` in environment `e` matches the type + * parameter `tp` of `target`. */ pragma[nomagic] private predicate directTypeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { not exists(getTypeArgument(a, target, tp, _)) and exists(AccessPosition apos, DeclarationPosition dpos, TypePath pathToTypeParam | tp = target.getDeclaredType(dpos, pathToTypeParam) and accessDeclarationPositionMatch(apos, dpos) and - adjustedAccessType(a, apos, target, pathToTypeParam.appendInverse(path), t) + adjustedAccessType(a, e, apos, target, pathToTypeParam.appendInverse(path), t) ) } private module AccessBaseType { /** - * Holds if inferring types at `a` might depend on the type at `path` of - * `apos` having `base` as a transitive base type. + * Holds if inferring types at `a` in environment `e` might depend on the type at + * `path` of `apos` having `base` as a transitive base type. */ - private predicate relevantAccess(Access a, AccessPosition apos, Type base) { + private predicate relevantAccess( + Access a, AccessEnvironment e, AccessPosition apos, Type base + ) { exists(Declaration target, DeclarationPosition dpos | - adjustedAccessType(a, apos, target, _, _) and + adjustedAccessType(a, e, apos, target, _, _) and accessDeclarationPositionMatch(apos, dpos) and declarationBaseType(target, dpos, base, _, _) ) } pragma[nomagic] - private Type inferTypeAt(Access a, AccessPosition apos, TypeParameter tp, TypePath suffix) { - relevantAccess(a, apos, _) and + private Type inferTypeAt( + Access a, AccessEnvironment e, AccessPosition apos, TypeParameter tp, TypePath suffix + ) { + relevantAccess(a, e, apos, _) and exists(TypePath path0 | - result = a.getInferredType(apos, path0) and + result = a.getInferredType(e, apos, path0) and path0.isCons(tp, suffix) ) } /** * Holds if `baseMention` is a (transitive) base type mention of the - * type of `a` at position `apos` at path `pathToSub`, and `t` is - * mentioned (implicitly) at `path` inside `base`. For example, in + * type of `a` at position `apos` at path `pathToSub` in environment + * `e`, and `t` is mentioned (implicitly) at `path` inside `base`. + * + * For example, in * * ```csharp * class C { } @@ -1234,15 +1265,16 @@ module Make1 Input1> { * `Base>` | `"T2.T1.T1"` | `int` */ predicate hasBaseTypeMention( - Access a, AccessPosition apos, TypeMention baseMention, TypePath path, Type t + Access a, AccessEnvironment e, AccessPosition apos, TypeMention baseMention, + TypePath path, Type t ) { - relevantAccess(a, apos, resolveTypeMentionRoot(baseMention)) and - exists(Type sub | sub = a.getInferredType(apos, TypePath::nil()) | + relevantAccess(a, e, apos, resolveTypeMentionRoot(baseMention)) and + exists(Type sub | sub = a.getInferredType(e, apos, TypePath::nil()) | baseTypeMentionHasNonTypeParameterAt(sub, baseMention, path, t) or exists(TypePath prefix, TypePath suffix, TypeParameter tp | baseTypeMentionHasTypeParameterAt(sub, baseMention, prefix, tp) and - t = inferTypeAt(a, apos, tp, suffix) and + t = inferTypeAt(a, e, apos, tp, suffix) and path = prefix.append(suffix) ) ) @@ -1251,35 +1283,39 @@ module Make1 Input1> { private module AccessConstraint { predicate relevantAccessConstraint( - Access a, Declaration target, AccessPosition apos, TypePath path, Type constraint + Access a, AccessEnvironment e, Declaration target, AccessPosition apos, TypePath path, + Type constraint ) { - target = a.getTarget() and + target = a.getTarget(e) and typeParameterConstraintHasTypeParameter(target, apos, path, constraint, _, _) } private newtype TRelevantAccess = - MkRelevantAccess(Access a, Declaration target, AccessPosition apos, TypePath path) { - relevantAccessConstraint(a, target, apos, path, _) + MkRelevantAccess( + Access a, AccessEnvironment e, Declaration target, AccessPosition apos, TypePath path + ) { + relevantAccessConstraint(a, e, target, apos, path, _) } /** - * If the access `a` for `apos` and `path` has an inferred type which - * type inference requires to satisfy some constraint. + * If the access `a` for `apos`, environment `e`, and `path` has an inferred type + * which type inference requires to satisfy some constraint. */ private class RelevantAccess extends MkRelevantAccess { Access a; + AccessEnvironment e; Declaration target; AccessPosition apos; TypePath path; - RelevantAccess() { this = MkRelevantAccess(a, target, apos, path) } + RelevantAccess() { this = MkRelevantAccess(a, e, target, apos, path) } Type getTypeAt(TypePath suffix) { - adjustedAccessType(a, apos, target, path.appendInverse(suffix), result) + adjustedAccessType(a, e, apos, target, path.appendInverse(suffix), result) } /** Holds if this relevant access should satisfy `constraint`. */ - Type getConstraint() { relevantAccessConstraint(a, target, apos, path, result) } + Type getConstraint() { relevantAccessConstraint(a, e, target, apos, path, result) } string toString() { result = a.toString() + ", " + apos.toString() + ", " + path.toString() @@ -1297,24 +1333,24 @@ module Make1 Input1> { } predicate satisfiesConstraintType( - Access a, Declaration target, AccessPosition apos, TypePath prefix, Type constraint, - TypePath path, Type t + Access a, AccessEnvironment e, Declaration target, AccessPosition apos, TypePath prefix, + Type constraint, TypePath path, Type t ) { SatisfiesConstraint::satisfiesConstraintType(MkRelevantAccess(a, - target, apos, prefix), constraint, path, t) + e, target, apos, prefix), constraint, path, t) } } /** - * Holds if the type of `a` at `apos` has the base type `base`, and when - * viewed as an element of that type has the type `t` at `path`. + * Holds if the type of `a` at `apos` in environment `e` has the base type `base`, + * and when viewed as an element of that type has the type `t` at `path`. */ pragma[nomagic] private predicate accessBaseType( - Access a, AccessPosition apos, Type base, TypePath path, Type t + Access a, AccessEnvironment e, AccessPosition apos, Type base, TypePath path, Type t ) { exists(TypeMention tm | - AccessBaseType::hasBaseTypeMention(a, apos, tm, path, t) and + AccessBaseType::hasBaseTypeMention(a, e, apos, tm, path, t) and base = resolveTypeMentionRoot(tm) ) } @@ -1332,9 +1368,9 @@ module Make1 Input1> { } /** - * Holds if the (transitive) base type `t` at `path` of `a` for some - * `AccessPosition` matches the type parameter `tp`, which is used in the - * declared types of `target`. + * Holds if the (transitive) base type `t` at `path` of `a` in environment `e` + * for some `AccessPosition` matches the type parameter `tp`, which is used in + * the declared types of `target`. * * For example, in * @@ -1365,27 +1401,27 @@ module Make1 Input1> { */ pragma[nomagic] private predicate baseTypeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { not exists(getTypeArgument(a, target, tp, _)) and - target = a.getTarget() and + target = a.getTarget(e) and exists(AccessPosition apos, DeclarationPosition dpos, Type base, TypePath pathToTypeParam | - accessBaseType(a, apos, base, pathToTypeParam.appendInverse(path), t) and + accessBaseType(a, e, apos, base, pathToTypeParam.appendInverse(path), t) and declarationBaseType(target, dpos, base, pathToTypeParam, tp) and accessDeclarationPositionMatch(apos, dpos) ) } /** - * Holds if for `a` and corresponding `target`, the type parameter `tp` is - * matched by a type argument at the access with type `t` and type path + * Holds if for `a` and corresponding `target` in environment `e`, the type parameter + * `tp` is matched by a type argument at the access with type `t` and type path * `path`. */ pragma[nomagic] private predicate explicitTypeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { - target = a.getTarget() and + target = a.getTarget(e) and t = getTypeArgument(a, target, tp, path) } @@ -1427,36 +1463,36 @@ module Make1 Input1> { pragma[nomagic] private predicate typeConstraintBaseTypeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { not exists(getTypeArgument(a, target, tp, _)) and exists(Type constraint, AccessPosition apos, TypePath pathToTp, TypePath pathToTp2 | typeParameterConstraintHasTypeParameter(target, apos, pathToTp2, constraint, pathToTp, tp) and - AccessConstraint::satisfiesConstraintType(a, target, apos, pathToTp2, constraint, + AccessConstraint::satisfiesConstraintType(a, e, target, apos, pathToTp2, constraint, pathToTp.appendInverse(path), t) ) } pragma[inline] private predicate typeMatch( - Access a, Declaration target, TypePath path, Type t, TypeParameter tp + Access a, AccessEnvironment e, Declaration target, TypePath path, Type t, TypeParameter tp ) { // A type given at the access corresponds directly to the type parameter // at the target. - explicitTypeMatch(a, target, path, t, tp) + explicitTypeMatch(a, e, target, path, t, tp) or // We can infer the type of `tp` from one of the access positions - directTypeMatch(a, target, path, t, tp) + directTypeMatch(a, e, target, path, t, tp) or // We can infer the type of `tp` by going up the type hiearchy - baseTypeMatch(a, target, path, t, tp) + baseTypeMatch(a, e, target, path, t, tp) or // We can infer the type of `tp` by a type constraint - typeConstraintBaseTypeMatch(a, target, path, t, tp) + typeConstraintBaseTypeMatch(a, e, target, path, t, tp) } /** - * Gets the inferred type of `a` at `path` for position `apos`. + * Gets the inferred type of `a` at `path` for position `apos` and environment `e`. * * For example, in * @@ -1494,25 +1530,168 @@ module Make1 Input1> { * `"T2.T1.T1"` | `int` */ pragma[nomagic] - Type inferAccessType(Access a, AccessPosition apos, TypePath path) { + Type inferAccessType(Access a, AccessEnvironment e, AccessPosition apos, TypePath path) { exists(DeclarationPosition dpos | accessDeclarationPositionMatch(apos, dpos) | // A suffix of `path` leads to a type parameter in the target exists(Declaration target, TypePath prefix, TypeParameter tp, TypePath suffix | tp = target.getDeclaredType(dpos, prefix) and path = prefix.append(suffix) and - typeMatch(a, target, suffix, result, tp) + typeMatch(a, e, target, suffix, result, tp) ) or // `path` corresponds directly to a concrete type in the declaration exists(Declaration target | result = target.getDeclaredType(dpos, path) and - target = a.getTarget() and + target = a.getTarget(e) and not result instanceof TypeParameter ) ) } } + /** Provides the input to `Matching`. */ + signature module MatchingInputSig { + /** + * A position inside a declaration. For example, the integer position of a + * parameter inside a method or the return type of a method. + */ + bindingset[this] + class DeclarationPosition { + /** Gets a textual representation of this position. */ + bindingset[this] + string toString(); + } + + /** A declaration, for example a method. */ + class Declaration { + /** Gets a textual representation of this declaration. */ + string toString(); + + /** Gets the location of this declaration. */ + Location getLocation(); + + /** Gets the type parameter at position `tppos` of this declaration, if any. */ + TypeParameter getTypeParameter(TypeParameterPosition tppos); + + /** + * Gets the declared type of this declaration at `path` for position `dpos`. + * + * For example, if this declaration is the method `int M(bool b)`, + * then the declared type at parameter position `0` is `bool`, the + * declared type at the `this` position is the class type, and the + * declared return type is `int`. + */ + Type getDeclaredType(DeclarationPosition dpos, TypePath path); + } + + /** + * A position inside an access. For example, the integer position of an + * argument inside a method call. + */ + bindingset[this] + class AccessPosition { + /** Gets a textual representation of this position. */ + bindingset[this] + string toString(); + } + + /** An access that targets a declaration, for example a method call. */ + class Access { + /** Gets a textual representation of this access. */ + string toString(); + + /** Gets the location of this access. */ + Location getLocation(); + + /** + * Gets the type at `path` for the type argument at position `tapos` of + * this access, if any. + * + * For example, in a method call like `M()`, `int` is an explicit + * type argument at position `0`. + */ + Type getTypeArgument(TypeArgumentPosition tapos, TypePath path); + + /** + * Gets the inferred type at `path` for the position `apos` of this access. + * + * For example, if this access is the method call `M(42)`, then the inferred + * type at argument position `0` is `int`. + */ + Type getInferredType(AccessPosition apos, TypePath path); + + /** Gets the declaration that this access targets. */ + Declaration getTarget(); + } + + /** Holds if `apos` and `dpos` match. */ + bindingset[apos] + bindingset[dpos] + predicate accessDeclarationPositionMatch(AccessPosition apos, DeclarationPosition dpos); + + /** + * Holds if matching an inferred type `t` at `path` inside an access at `apos` + * against the declaration `target` means that the type should be adjusted to + * `tAdj` at `pathAdj`. + * + * For example, in + * + * ```csharp + * void M(int? i) {} + * M(42); + * ``` + * + * the inferred type of `42` is `int`, but it should be adjusted to `int?` + * when matching against `M`. + */ + bindingset[apos, target, path, t] + default predicate adjustAccessType( + AccessPosition apos, Declaration target, TypePath path, Type t, TypePath pathAdj, Type tAdj + ) { + pathAdj = path and + tAdj = t + } + } + + /** + * Provides logic for matching types at accesses against types at the + * declarations that the accesses target. + * + * Matching takes both base types and explicit type arguments into account. + */ + module Matching { + private module Inp implements MatchingWithEnvironmentInputSig { + private import codeql.util.Unit + import Input + + predicate adjustAccessType = Input::adjustAccessType/6; + + class AccessEnvironment = Unit; + + final private class AccessFinal = Input::Access; + + class Access extends AccessFinal { + Type getInferredType(AccessEnvironment e, AccessPosition apos, TypePath path) { + exists(e) and + result = super.getInferredType(apos, path) + } + + Declaration getTarget(AccessEnvironment e) { + exists(e) and + result = super.getTarget() + } + } + } + + private module M = MatchingWithEnvironment; + + import M + + Type inferAccessType(Input::Access a, Input::AccessPosition apos, TypePath path) { + result = M::inferAccessType(a, _, apos, path) + } + } + /** Provides consistency checks. */ module Consistency { query predicate missingTypeParameterId(TypeParameter tp) { diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 896a509a85b8..5fd940634b31 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.11 +version: 0.0.12 groups: shared library: true dependencies: diff --git a/shared/typetracking/CHANGELOG.md b/shared/typetracking/CHANGELOG.md index 4e7d55fc700a..1372c8c89ea1 100644 --- a/shared/typetracking/CHANGELOG.md +++ b/shared/typetracking/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.15 + +No user-facing changes. + ## 2.0.14 No user-facing changes. diff --git a/shared/typetracking/change-notes/released/2.0.15.md b/shared/typetracking/change-notes/released/2.0.15.md new file mode 100644 index 000000000000..3b59db4224a0 --- /dev/null +++ b/shared/typetracking/change-notes/released/2.0.15.md @@ -0,0 +1,3 @@ +## 2.0.15 + +No user-facing changes. diff --git a/shared/typetracking/codeql-pack.release.yml b/shared/typetracking/codeql-pack.release.yml index 23aa0864b298..0377ae283a31 100644 --- a/shared/typetracking/codeql-pack.release.yml +++ b/shared/typetracking/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.14 +lastReleaseVersion: 2.0.15 diff --git a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll index fcfcfe9ecd1d..a98e5ec8254d 100644 --- a/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll +++ b/shared/typetracking/codeql/typetracking/internal/TypeTrackingImpl.qll @@ -70,6 +70,10 @@ module TypeTracking I> { private class ContentOption = ContentOption::Option; + private predicate isLocalSourceNode(LocalSourceNode n) { + not nonStandardFlowsTo(_, _) and exists(n) + } + cached private module Cached { cached @@ -249,21 +253,9 @@ module TypeTracking I> { returnStep(nodeFrom, nodeTo) and summary = ReturnStep() } - pragma[inline] - private predicate isLocalSourceNode(LocalSourceNode n) { any() } - cached - predicate standardFlowsTo(Node localSource, Node dst) { - not nonStandardFlowsTo(_, _) and - // explicit type check in base case to avoid repeated type tests in recursive case - isLocalSourceNode(localSource) and - dst = localSource - or - exists(Node mid | - standardFlowsTo(localSource, mid) and - simpleLocalSmallStep(mid, dst) - ) - } + predicate simpleLocalSmallStepPlus(Node localSource, Node dst) = + sourceBoundedFastTC(simpleLocalSmallStep/2, isLocalSourceNode/1)(localSource, dst) cached predicate stepNoCall(LocalSourceNode nodeFrom, LocalSourceNode nodeTo, StepSummary summary) { @@ -276,6 +268,14 @@ module TypeTracking I> { } } + pragma[inline] + private predicate standardFlowsTo(Node localSource, Node dst) { + isLocalSourceNode(localSource) and + dst = localSource + or + simpleLocalSmallStepPlus(localSource, dst) + } + import Cached /** diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 8086557d787f..f982bade08da 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.14 +version: 2.0.15 groups: shared library: true dependencies: diff --git a/shared/typos/CHANGELOG.md b/shared/typos/CHANGELOG.md index 37548ac47d54..c44b941f9e33 100644 --- a/shared/typos/CHANGELOG.md +++ b/shared/typos/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/typos/change-notes/released/1.0.31.md b/shared/typos/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/typos/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/typos/codeql-pack.release.yml b/shared/typos/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/typos/codeql-pack.release.yml +++ b/shared/typos/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index c15c298051f9..8885de0dbd06 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.30 +version: 1.0.31 groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/CHANGELOG.md b/shared/util/CHANGELOG.md index 193ce4e9521b..d9169a8d5d87 100644 --- a/shared/util/CHANGELOG.md +++ b/shared/util/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.18 + +No user-facing changes. + ## 2.0.17 ### Minor Analysis Improvements diff --git a/shared/util/change-notes/released/2.0.18.md b/shared/util/change-notes/released/2.0.18.md new file mode 100644 index 000000000000..11e398dac31a --- /dev/null +++ b/shared/util/change-notes/released/2.0.18.md @@ -0,0 +1,3 @@ +## 2.0.18 + +No user-facing changes. diff --git a/shared/util/codeql-pack.release.yml b/shared/util/codeql-pack.release.yml index a5f7c15c020f..16342205c738 100644 --- a/shared/util/codeql-pack.release.yml +++ b/shared/util/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 2.0.17 +lastReleaseVersion: 2.0.18 diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 79dc89b3d4bb..703dee01cba4 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.17 +version: 2.0.18 groups: shared library: true dependencies: null diff --git a/shared/xml/CHANGELOG.md b/shared/xml/CHANGELOG.md index 962044915369..59ae3e2581a1 100644 --- a/shared/xml/CHANGELOG.md +++ b/shared/xml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/xml/change-notes/released/1.0.31.md b/shared/xml/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/xml/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/xml/codeql-pack.release.yml b/shared/xml/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/xml/codeql-pack.release.yml +++ b/shared/xml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index c6ad5ad9d2ad..6b8d051c622a 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.30 +version: 1.0.31 groups: shared library: true dependencies: diff --git a/shared/yaml/CHANGELOG.md b/shared/yaml/CHANGELOG.md index 67e07b084672..2254f38fb9ff 100644 --- a/shared/yaml/CHANGELOG.md +++ b/shared/yaml/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.31 + +No user-facing changes. + ## 1.0.30 No user-facing changes. diff --git a/shared/yaml/change-notes/released/1.0.31.md b/shared/yaml/change-notes/released/1.0.31.md new file mode 100644 index 000000000000..b2642bbb5f89 --- /dev/null +++ b/shared/yaml/change-notes/released/1.0.31.md @@ -0,0 +1,3 @@ +## 1.0.31 + +No user-facing changes. diff --git a/shared/yaml/codeql-pack.release.yml b/shared/yaml/codeql-pack.release.yml index f04640951dec..f5bdc98ffc82 100644 --- a/shared/yaml/codeql-pack.release.yml +++ b/shared/yaml/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.0.30 +lastReleaseVersion: 1.0.31 diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 8588e1f0c6a1..b443b23dac2d 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.30 +version: 1.0.31 groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/CHANGELOG.md b/swift/ql/lib/CHANGELOG.md index cef716a25783..7138ed02a2b1 100644 --- a/swift/ql/lib/CHANGELOG.md +++ b/swift/ql/lib/CHANGELOG.md @@ -1,3 +1,9 @@ +## 5.0.7 + +### Minor Analysis Improvements + +* Updated to allow analysis of Swift 6.1.3. + ## 5.0.6 No user-facing changes. diff --git a/swift/ql/lib/change-notes/released/5.0.7.md b/swift/ql/lib/change-notes/released/5.0.7.md new file mode 100644 index 000000000000..f10f4382e266 --- /dev/null +++ b/swift/ql/lib/change-notes/released/5.0.7.md @@ -0,0 +1,5 @@ +## 5.0.7 + +### Minor Analysis Improvements + +* Updated to allow analysis of Swift 6.1.3. diff --git a/swift/ql/lib/codeql-pack.release.yml b/swift/ql/lib/codeql-pack.release.yml index cc6fded2554d..accf4086d8ac 100644 --- a/swift/ql/lib/codeql-pack.release.yml +++ b/swift/ql/lib/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 5.0.6 +lastReleaseVersion: 5.0.7 diff --git a/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll b/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll index b6ac7144ac4e..e5acea49fdad 100644 --- a/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll +++ b/swift/ql/lib/codeql/swift/controlflow/BasicBlocks.qll @@ -3,7 +3,6 @@ private import swift private import ControlFlowGraph private import internal.ControlFlowGraphImpl as CfgImpl -private import SuccessorTypes private import CfgImpl::BasicBlocks as BasicBlocksImpl private import codeql.controlflow.BasicBlock as BB @@ -120,13 +119,9 @@ private class EntryBasicBlockAlias = EntryBasicBlock; private class ControlFlowNodeAlias = ControlFlowNode; -private class SuccessorTypeAlias = SuccessorType; - module Cfg implements BB::CfgSig { class ControlFlowNode = ControlFlowNodeAlias; - class SuccessorType = SuccessorTypeAlias; - class BasicBlock = BasicBlockAlias; class EntryBasicBlock = EntryBasicBlockAlias; diff --git a/swift/ql/lib/codeql/swift/controlflow/ControlFlowGraph.qll b/swift/ql/lib/codeql/swift/controlflow/ControlFlowGraph.qll index 4d1be28b0012..ef443f301841 100644 --- a/swift/ql/lib/codeql/swift/controlflow/ControlFlowGraph.qll +++ b/swift/ql/lib/codeql/swift/controlflow/ControlFlowGraph.qll @@ -2,11 +2,11 @@ private import swift private import BasicBlocks -private import SuccessorTypes private import internal.ControlFlowGraphImpl as CfgImpl private import internal.Completion private import internal.Scope private import internal.ControlFlowElements +import codeql.controlflow.SuccessorType /** An AST node with an associated control-flow graph. */ class CfgScope extends Scope instanceof CfgImpl::CfgScope::Range_ { @@ -61,72 +61,3 @@ class ControlFlowNode extends CfgImpl::Node { /** Holds if this node has more than one successor. */ final predicate isBranch() { strictcount(this.getASuccessor()) > 1 } } - -/** The type of a control flow successor. */ -class SuccessorType extends CfgImpl::TSuccessorType { - /** Gets a textual representation of successor type. */ - string toString() { none() } -} - -/** Provides different types of control flow successor types. */ -module SuccessorTypes { - /** A normal control flow successor. */ - class NormalSuccessor extends SuccessorType, CfgImpl::TSuccessorSuccessor { - final override string toString() { result = "successor" } - } - - /** A conditional control flow successor. */ - abstract class ConditionalSuccessor extends SuccessorType { - boolean value; - - bindingset[value] - ConditionalSuccessor() { any() } - - /** Gets the Boolean value of this successor. */ - final boolean getValue() { result = value } - - override string toString() { result = this.getValue().toString() } - } - - /** A Boolean control flow successor. */ - class BooleanSuccessor extends ConditionalSuccessor, CfgImpl::TBooleanSuccessor { - BooleanSuccessor() { this = CfgImpl::TBooleanSuccessor(value) } - } - - class BreakSuccessor extends SuccessorType, CfgImpl::TBreakSuccessor { - final override string toString() { result = "break" } - } - - class ContinueSuccessor extends SuccessorType, CfgImpl::TContinueSuccessor { - final override string toString() { result = "continue" } - } - - class ReturnSuccessor extends SuccessorType, CfgImpl::TReturnSuccessor { - final override string toString() { result = "return" } - } - - class MatchingSuccessor extends ConditionalSuccessor, CfgImpl::TMatchingSuccessor { - MatchingSuccessor() { this = CfgImpl::TMatchingSuccessor(value) } - - /** Holds if this is a match successor. */ - predicate isMatch() { value = true } - - override string toString() { if this.isMatch() then result = "match" else result = "no-match" } - } - - class FallthroughSuccessor extends SuccessorType, CfgImpl::TFallthroughSuccessor { - final override string toString() { result = "fallthrough" } - } - - class EmptinessSuccessor extends ConditionalSuccessor, CfgImpl::TEmptinessSuccessor { - EmptinessSuccessor() { this = CfgImpl::TEmptinessSuccessor(value) } - - predicate isEmpty() { value = true } - - override string toString() { if this.isEmpty() then result = "empty" else result = "non-empty" } - } - - class ExceptionSuccessor extends SuccessorType, CfgImpl::TExceptionSuccessor { - override string toString() { result = "exception" } - } -} diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll b/swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll index 9e7975890e62..4a2acdf9e20e 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/Completion.qll @@ -8,7 +8,6 @@ private import swift private import codeql.swift.controlflow.ControlFlowGraph private import ControlFlowElements private import ControlFlowGraphImpl -private import SuccessorTypes private newtype TCompletion = TSimpleCompletion() or @@ -324,7 +323,7 @@ abstract class NormalCompletion extends Completion { /** A simple (normal) completion. */ class SimpleCompletion extends NormalCompletion, TSimpleCompletion { - override NormalSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } override string toString() { result = "simple" } } @@ -468,7 +467,7 @@ class FallthroughCompletion extends Completion, TFallthroughCompletion { FallthroughCompletion() { this = TFallthroughCompletion(dest) } - override FallthroughSuccessor getAMatchingSuccessorType() { any() } + override DirectSuccessor getAMatchingSuccessorType() { any() } CaseStmt getDestination() { result = dest } diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll index b610ff0b0f3d..59d2acb5857f 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImpl.qll @@ -1976,18 +1976,6 @@ private module Cached { result = n.(FuncDeclElement).getAst() or result = n.(KeyPathElement).getAst() } - - cached - newtype TSuccessorType = - TSuccessorSuccessor() or - TBooleanSuccessor(boolean b) { b in [false, true] } or - TBreakSuccessor() or - TContinueSuccessor() or - TReturnSuccessor() or - TMatchingSuccessor(boolean match) { match in [false, true] } or - TFallthroughSuccessor() or - TEmptinessSuccessor(boolean isEmpty) { isEmpty in [false, true] } or - TExceptionSuccessor() } import Cached diff --git a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll index 24548290ea07..37625e0be10c 100644 --- a/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll +++ b/swift/ql/lib/codeql/swift/controlflow/internal/ControlFlowGraphImplSpecific.qll @@ -48,33 +48,11 @@ module CfgInput implements InputSig { CfgScope getCfgScope(AstNode n) { result = scopeOfAst(n.asAstNode()) } - class SuccessorType = Cfg::SuccessorType; + private class SuccessorType = Cfg::SuccessorType; /** Gets a successor type that matches completion `c`. */ SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - /** - * Hold if `c` represents simple (normal) evaluation of a statement or an - * expression. - */ - predicate successorTypeIsSimple(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::NormalSuccessor - } - - /** Holds if `t` is an abnormal exit type out of a CFG scope. */ - predicate isAbnormalExitType(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::ExceptionSuccessor - } - - /** Hold if `t` represents a conditional successor type. */ - predicate successorTypeIsCondition(SuccessorType t) { - t instanceof Cfg::SuccessorTypes::BooleanSuccessor or - t instanceof Cfg::SuccessorTypes::BreakSuccessor or - t instanceof Cfg::SuccessorTypes::ContinueSuccessor or - t instanceof Cfg::SuccessorTypes::MatchingSuccessor or - t instanceof Cfg::SuccessorTypes::EmptinessSuccessor - } - /** Holds if `first` is first executed when entering `scope`. */ predicate scopeFirst(CfgScope scope, AstNode first) { scope.(Impl::CfgScope::Range_).entry(first) diff --git a/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll b/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll index 72608f50fe66..1ad4e7734561 100644 --- a/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll +++ b/swift/ql/lib/codeql/swift/security/PathInjectionExtensions.qll @@ -108,7 +108,7 @@ private class DefaultPathInjectionBarrier extends PathInjectionBarrier { TaintTracking::localTaint(validated, DataFlow::exprNode(normalize.getQualifier())) and DataFlow::localExprFlow(normalize, starts.getQualifier()) and DataFlow::localFlow(validated, this) and - exists(ConditionBlock bb, SuccessorTypes::BooleanSuccessor b | + exists(ConditionBlock bb, BooleanSuccessor b | bb.getANode().getNode().asAstNode().(IfStmt).getACondition() = getImmediateParent*(starts) and b.getValue() = true | diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index f85ca7dfc79c..6069c9b7ab1a 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 5.0.6 +version: 5.0.7 groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/CHANGELOG.md b/swift/ql/src/CHANGELOG.md index 58d42ca78132..eac658646174 100644 --- a/swift/ql/src/CHANGELOG.md +++ b/swift/ql/src/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.2.5 + +No user-facing changes. + ## 1.2.4 ### Bug Fixes diff --git a/swift/ql/src/change-notes/released/1.2.5.md b/swift/ql/src/change-notes/released/1.2.5.md new file mode 100644 index 000000000000..c805dc2cd4c3 --- /dev/null +++ b/swift/ql/src/change-notes/released/1.2.5.md @@ -0,0 +1,3 @@ +## 1.2.5 + +No user-facing changes. diff --git a/swift/ql/src/codeql-pack.release.yml b/swift/ql/src/codeql-pack.release.yml index 172090f46b6d..40355f0807f9 100644 --- a/swift/ql/src/codeql-pack.release.yml +++ b/swift/ql/src/codeql-pack.release.yml @@ -1,2 +1,2 @@ --- -lastReleaseVersion: 1.2.4 +lastReleaseVersion: 1.2.5 diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index 2923562dd2b2..61d22677b832 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.2.4 +version: 1.2.5 groups: - swift - queries diff --git a/swift/third_party/resources/resource-dir-linux.zip b/swift/third_party/resources/resource-dir-linux.zip index 251b0ca7fb64..406585144432 100644 --- a/swift/third_party/resources/resource-dir-linux.zip +++ b/swift/third_party/resources/resource-dir-linux.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f6c681b4e1d92ad848d35bf75c41d3e33474d45ce5f270cd814d879ca8fe8511 -size 291469999 +oid sha256:57158fff2fa967f1fad327b2bfc7bb2490dcd063935104a04d1c7740a4a9a1bb +size 291553836 diff --git a/swift/third_party/resources/resource-dir-macos.zip b/swift/third_party/resources/resource-dir-macos.zip index 678fb09a8b7b..5a2118566adc 100644 --- a/swift/third_party/resources/resource-dir-macos.zip +++ b/swift/third_party/resources/resource-dir-macos.zip @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9a22d9a4563ea0ad0b5051a997850d425d61ba5219ac35e9994d9a2f40a82f42 -size 593013753 +oid sha256:4518d5a4268766b1768bbf97b3124aa463f95e030f26014cea6fe00752c15a0e +size 593025623 diff --git a/swift/third_party/resources/swift-prebuilt-linux.tar.zst b/swift/third_party/resources/swift-prebuilt-linux.tar.zst index 6efea3475860..3ffc85268bdd 100644 --- a/swift/third_party/resources/swift-prebuilt-linux.tar.zst +++ b/swift/third_party/resources/swift-prebuilt-linux.tar.zst @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:abc83ba5ca0c7009714593c3c875f29510597e470bac0722b3357a78880feee4 -size 124406561 +oid sha256:73d6246cfc84ab2cd0fc065c3a27c18f4ee3460dccb4b2c54a7396b6f4f4d6e3 +size 124356033 diff --git a/swift/third_party/resources/swift-prebuilt-macos.tar.zst b/swift/third_party/resources/swift-prebuilt-macos.tar.zst index ca29f3ebd3f1..4483ca68d275 100644 --- a/swift/third_party/resources/swift-prebuilt-macos.tar.zst +++ b/swift/third_party/resources/swift-prebuilt-macos.tar.zst @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:417c018d9aea00f9e33b26a3853ae540388276e6e4d02ef81955b2794b3a6152 -size 104344626 +oid sha256:af2bdbe79f75be0374c62ba3a0188d313a907c0c349bf454efcd015d5c6029ca +size 104925305 diff --git a/swift/third_party/resources/updating.md b/swift/third_party/resources/updating.md index 80dad329643b..766d3e9410ee 100644 --- a/swift/third_party/resources/updating.md +++ b/swift/third_party/resources/updating.md @@ -22,4 +22,5 @@ In order to perform a Swift update: ``` (or whatever you have overridden). This will pull the staged archives in the repository for git LFS. 8. Clear `_override` in [`load.bzl`](../load.bzl). -9. Push and your PR will be ready for `main`. +9. Add a change note to the [library change note directory](../../ql/lib/change-notes/) that mentions that we now support the Swift version we updated to. +10. Push and your PR will be ready for `main`.
  • Mozilla Developer Network: CORS, Access-Control-Allow-Origin.